156 votes

python NameError : le nom global '__file__' n'est pas défini

Lorsque j'exécute ce code dans python 2.7, j'obtiens cette erreur :

Traceback (most recent call last):
File "C:\Python26\Lib\site-packages\pyutilib.subprocess-3.5.4\setup.py", line 30, in <module>
    long_description = read('README.txt'),
  File "C:\Python26\Lib\site-packages\pyutilib.subprocess-3.5.4\setup.py", line 19, in read
    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
NameError: global name '__file__' is not defined

Le code est :

import os
from setuptools import setup

def read(*rnames):
    return open(os.path.join(os.path.dirname(__file__), *rnames)).read()

setup(name="pyutilib.subprocess",
    version='3.5.4',
    maintainer='William E. Hart',
    maintainer_email='wehart@sandia.gov',
    url = 'https://software.sandia.gov/svn/public/pyutilib/pyutilib.subprocess',
    license = 'BSD',
    platforms = ["any"],
    description = 'PyUtilib utilites for managing subprocesses.',
    long_description = read('README.txt'),
    classifiers = [
        'Development Status :: 4 - Beta',
        'Intended Audience :: End Users/Desktop',
        'License :: OSI Approved :: BSD License',
        'Natural Language :: English',
        'Operating System :: Microsoft :: Windows',
        'Operating System :: Unix',
        'Programming Language :: Python',
        'Programming Language :: Unix Shell',
        'Topic :: Scientific/Engineering :: Mathematics',
        'Topic :: Software Development :: Libraries :: Python Modules'],
      packages=['pyutilib', 'pyutilib.subprocess', 'pyutilib.subprocess.tests'],
      keywords=['utility'],
      namespace_packages=['pyutilib'],
      install_requires=['pyutilib.common', 'pyutilib.services']
      )

181voto

Nilesh Points 2133

Cette erreur survient lorsque vous ajoutez cette ligne os.path.join(os.path.dirname(__file__)) dans le shell interactif python.

Python Shell ne détecte pas le chemin du fichier actuel dans __file__ et c'est lié à votre filepath dans laquelle vous avez ajouté cette ligne

Vous devez donc écrire cette ligne os.path.join(os.path.dirname(__file__)) sur file.py . et ensuite exécuter python file.py Cela fonctionne parce qu'il prend votre chemin de fichier.

38voto

Kwuite Points 1

J'ai eu le même problème avec PyInstaller et Py2exe et je suis tombé sur la résolution de la FAQ de cx-freeze.

Lorsque vous utilisez votre script depuis la console ou en tant qu'application, les fonctions ci-dessous vous fourniront le "chemin d'exécution", et non le "chemin du fichier réel" :

print(os.getcwd())
print(sys.argv[0])
print(os.path.dirname(os.path.realpath('__file__')))

Source :
http://cx-freeze.readthedocs.org/en/latest/faq.html

Votre ancienne ligne (question initiale) :

def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()

Remplacez votre ligne de code par l'extrait suivant.

def find_data_file(filename):
    if getattr(sys, 'frozen', False):
        # The application is frozen
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen
        # Change this bit to match where you store your data files:
        datadir = os.path.dirname(__file__)

    return os.path.join(datadir, filename)

Avec le code ci-dessus vous pouvez ajouter votre application au chemin de votre système d'exploitation, vous pouvez l'exécuter n'importe où sans le problème que votre application est incapable de trouver ses fichiers de données/configuration.

Testé avec python :

  • 3.3.4
  • 2.7.13

27voto

Todd Points 176

J'ai rencontré des cas où __file__ ne fonctionne pas comme prévu. Mais la méthode suivante ne m'a pas fait défaut jusqu'à présent :

import inspect
src_file_path = inspect.getfile(lambda: None)

C'est ce qui se rapproche le plus de l'analogie entre Python et le langage C. __FILE__ .

Le comportement de l'outil Python __file__ est très différente de celle de C __FILE__ . La version C vous donnera le chemin original du fichier source. Ceci est utile pour enregistrer les erreurs et savoir quel fichier source contient le bogue.

Python __file__ ne vous donne que le nom du fichier en cours d'exécution, ce qui peut ne pas être très utile dans les journaux.

25voto

Jojo Josiane Points 365

Changez vos codes comme suit ! cela fonctionne pour moi. `

os.path.dirname(os.path.abspath("__file__"))

14voto

Brian Koech Points 76

Si vous utilisez le code dans un fichier .py : Utilisez os.path.abspath(__file__) Si vous utilisez le code sur un script directement ou dans les Jupyter Notebooks : Mettez le fichier entre guillemets. os.path.abspath("__file__")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X