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']
      )

10voto

Eloims Points 3711

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

sys.argv[0]

Vous devriez lire : Comment obtenir le chemin du fichier en cours d'exécution en Python ?

9voto

Andrew Fallgren Points 153

Si tout ce que vous cherchez est d'obtenir votre répertoire de travail actuel os.getcwd() vous donnera la même chose que os.path.dirname(__file__) tant que vous n'avez pas changé le répertoire de travail ailleurs dans votre code. os.getcwd() fonctionne également en mode interactif.

Alors os.path.join(os.path.dirname(__file__)) devient os.path.join(os.getcwd())

7voto

Burhan Khalid Points 50578

Vous obtiendrez ce résultat 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 passant en argument à la commande python commandement :

$ python somefile.py

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

3voto

crizCraig Points 2041

Si vous exécutez un fichier via la ligne de commande, vous pouvez utiliser cette astuce.

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 marché pour moi dans la console UnrealEnginePython, en appelant py.exec myfile.py

1voto

Oscar Rangel Points 352

Si vous utilisez le carnet de notes de Jupyter comme :

NOM_Modèle = os.path.basename( fichier )[:-3]

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-10-f391bbbab00d> in <module>
----> 1 MODEL_NAME = os.path.basename(__file__)[:-3]

NameError: name '__file__' is not defined

vous devez placer un ' ! ' devant, comme ceci

!MODEL_NAME = os.path.basename(__file__)[:-3]

/bin/bash: -c: line 0: syntax error near unexpected token `('
/bin/bash: -c: line 0: `MODEL_NAME = os.path.basename(__file__)[:-3]'

fait.....

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