it-swarm.com.de

python NameError: Der globale Name '__file__' ist nicht definiert

Wenn ich diesen Code in Python 2.7 ausführen, erhalte ich diesen Fehler:

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

code lautet:

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

Dieser Fehler tritt auf, wenn Sie diese Zeile os.path.join(os.path.dirname(__file__)) in der interaktiven Python-Shell anhängen. 

Python Shell erkennt den aktuellen Dateipfad in __file__ nicht und hängt mit Ihrer filepath in der Sie diese Zeile hinzugefügt haben

Schreiben Sie also diese Zeile os.path.join(os.path.dirname(__file__)) in file.py. und dann python file.py ausführen. Es funktioniert, weil es den Dateipfad benötigt.

101
Nilesh

Ich löste es, indem ich die Datei als eine Zeichenkette behandelte, d. H. "__file__" (zusammen mit den Anführungszeichen!) Anstelle von __file__.

Das funktioniert gut für mich:

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

Ich hatte das gleiche Problem mit PyInstaller und Py2exe, daher stieß ich auf die Auflösung der FAQ von cx-freeze.

Wenn Sie Ihr Skript von der Konsole oder als Anwendung verwenden, liefern Ihnen die Funktionen hier den "Ausführungspfad", nicht den "tatsächlichen Dateipfad":

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

Quelle:
http://cx-freeze.readthedocs.org/de/latest/faq.html

Ihre alte Zeile (Anfangsfrage):

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

Ersetzen Sie Ihre Codezeile durch den folgenden Code.

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)

Mit dem obigen Code können Sie Ihre Anwendung zum Pfad Ihres Betriebssystems hinzufügen. Sie können sie überall ausführen, ohne dass das Problem besteht, dass Ihre App die Daten-/Konfigurationsdateien nicht finden kann.

Mit Python getestet:

  • 3.3.4
  • 2.7.13
9
Kwuite

Verwenden Sie den interaktiven Dolmetscher? Sie können verwenden

sys.argv[0]

Sie sollten lesen: Wie erhalte ich den Pfad der aktuell ausgeführten Datei in Python?

8
Eloims

Wenn Sie nur nach Ihrem aktuellen Arbeitsverzeichnis suchen, erhalten Sie mit os.getcwd() dasselbe wie mit os.path.dirname(__file__), solange Sie das Arbeitsverzeichnis nicht an einer anderen Stelle in Ihrem Code geändert haben. os.getcwd() funktioniert auch im interaktiven Modus.

Also os.path.join(os.path.dirname(__file__)) wird os.path.join(os.getcwd())

6
Andrew Fallgren

Ich habe Fälle erlebt, in denen file nicht wie erwartet funktioniert. Folgendes ist mir bisher jedoch nicht entgangen:

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

Sie erhalten dies, wenn Sie die Befehle von der Python-Shell aus ausführen:

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

Sie müssen die Datei direkt ausführen, indem Sie sie als Argument an den Befehl python übergeben:

$ python somefile.py

In Ihrem Fall sollte es wirklich python setup.py install sein

2
Burhan Khalid

Was Sie tun können, ist Folgendes zu verwenden

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

Beachten Sie hierbei, dass die Verwendung der Zeichenfolge '__file__' tatsächlich auf die tatsächliche Variable __file__ verweist. Sie können das natürlich selbst testen.

Der zusätzliche Vorteil dieser Lösung ist die Flexibilität, wenn Sie ein Skript teilweise interaktiv ausführen (z. B. zum Testen/Entwickeln) und es über die Befehlszeile ausführen können 

1
zwep

Ändern Sie Ihre Codes wie folgt! es funktioniert für mich . `

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

0
Jojo Josiane

Wenn Sie eine Datei über die Befehlszeile ausführen, können Sie diesen Hack verwenden

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

Dies funktionierte für mich in der UnrealEnginePython-Konsole und rief py.exec myfile.py an.

0
crizCraig

Ich habe genau das gleiche Problem und benutze wahrscheinlich dasselbe Tutorial . Die Funktionsdefinition:

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

ist fehlerhaft, da os.path.dirname(__file__) nicht das zurückgibt, was Sie brauchen. Versuchen Sie, os.path.dirname(__file__) durch os.path.dirname(os.path.abspath(__file__)) zu ersetzen:

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

Ich habe gerade Andrew geschrieben, dass das Code-Snippet in aktuellen Dokumenten nicht funktioniert. Hoffentlich wird es korrigiert.

0
ducin