web-dev-qa-db-fra.com

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

Quand j'exécute ce code en 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='[email protected]',
    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']
      )
77
Kaibing Yang

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

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

Donc, vous devriez écrire cette ligne os.path.join(os.path.dirname(__file__)) dans file.py. et puis exécutez python file.py, cela fonctionne parce que cela prend votre chemin de fichier.

101
Nilesh

Je l'ai résolu en traitant le fichier comme une chaîne, c'est-à-dire mettre "__file__" (avec les guillemets!) Au lieu de __file__

Cela fonctionne bien pour moi:

wk_dir = os.path.dirname(os.path.realpath('__file__'))
9
lsheng

J'ai eu le même problème avec PyInstaller et Py2exe alors 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 de fichier actuel":

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

La 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()

Substituez votre ligne de code avec 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 que votre application ne puisse pas trouver ses fichiers de données/configuration.

Testé avec python:

  • 3.3.4
  • 2.7.13
9
Kwuite

Utilisez-vous l'interprète interactif? Vous pouvez utiliser

sys.argv[0]

Vous devriez lire: Comment puis-je obtenir le chemin du fichier actuellement exécuté en Python?

8
Eloims

J'ai rencontré des cas où file ne fonctionne pas comme prévu. Mais ce qui suit ne m'a pas manqué jusqu'à présent:

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

Vous obtiendrez ceci si vous exécutez les commandes à partir du shell python:

>>> __file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '__file__' is not defined

Vous devez exécuter le fichier directement en le transmettant en tant qu'argument à la commande python:

$ python somefile.py

Dans votre cas, cela devrait vraiment être python setup.py install

2
Burhan Khalid

Ce que vous pouvez faire est d'utiliser ce qui suit

import os
if '__file__' in vars():
    wk_dir = os.path.dirname(os.path.realpath('__file__'))
else:
    print('We are running the script interactively')

Notez ici que l’utilisation de la chaîne '__file__' fait effectivement référence à la variable réelle __file__. Vous pouvez le tester vous-même bien sûr ..

L’avantage supplémentaire de cette solution est la flexibilité lorsque vous exécutez un script en partie de manière interactive (par exemple, pour le tester/le développer) et que vous pouvez l’exécuter via la ligne de commande. 

1
zwep

changez vos codes comme suit! ça marche pour moi . `

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

0
Jojo Josiane

Si vous exécutez un fichier en ligne de commande, vous pouvez utiliser ce hack

import traceback

def get_this_filename():
    try:
        raise NotImplementedError("No error")
    except Exception as e:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        filename = traceback.extract_tb(exc_traceback)[-1].filename
    return filename

Cela a fonctionné pour moi dans la console UnrealEnginePython, en appelant py.exec myfile.py

0
crizCraig

J'ai exactement le même problème et j'utilise probablement le même tutoriel . La définition de la fonction:

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

est buggy, puisque os.path.dirname(__file__) ne vous retournera pas ce dont vous avez besoin. Essayez de remplacer os.path.dirname(__file__) par os.path.dirname(os.path.abspath(__file__)):

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

Je viens de poster Andrew que l'extrait de code dans la documentation actuelle ne fonctionne pas, j'espère qu'il sera corrigé.

0
ducin