2013-05-27 9 views
56

definiert ist, wenn ich diesen Code in Python 2.7 laufen, bekomme ich diesen Fehler:Python Nameerror: global name '__file__' nicht

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 ist:

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

Interessante ... – Alfe

+1

Versuchen Sie diesen Code aus der Shell ausgeführt wird: 'Python filename.py'. Related: http://bugs.python.org/issue8515 –

+1

Ich löste es, indem ich __file__ als String behandle, dh setze "__file__" (zusammen mit den Anführungszeichen!) Statt __file__ – lsheng

Antwort

7

Sind Sie mit dem interaktiven Dolmetscher? Sie können

sys.argv[0] 

verwenden Sie sollte lauten: How do I get the path of the current executed file in Python?

+0

fd = os.path.dirname (os. path.realpath (__ file__)) nd druck es gedruckt .../../ordner1/aber cwd = os.path.dirname (os.path.realpath (sys.argv [0])) >>> drucken cwd druckt ../../ –

+1

Dies gibt den Pfad zum binären Python, der die Shell gestartet hat, NICHT das aktuelle Arbeitsverzeichnis – hobs

0

Ich habe exacty das gleiche Problem und wahrscheinlich the same tutorial verwenden. Die Funktionsdefinition:

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

ist fehlerhaft, da os.path.dirname(__file__) wird nicht zurückkehren, was Sie brauchen. Versuchen Sie os.path.dirname(__file__) mit os.path.dirname(os.path.abspath(__file__)) ersetzen:

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

Ich habe gerade geschrieben Andrew, dass der Code-Schnipsel in aktuellen docs nicht funktionieren, hoffentlich, wird es korrigiert werden.

2

Sie dies, wenn Sie die Befehle aus der Python-Shell ausgeführt werden:

>>> __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 in als Argument für den python Befehl übergeben:

$ python somefile.py 

in Ihrem Fall, es sollte wirklich python setup.py install

63

sein Dieser Fehler kommt, wenn Sie diese Zeile os.path.join(os.path.dirname(__file__)) in python anhängen interaktive Shell.

Python Shell erkennt keine aktuellen Dateipfad in __file__ und es ist im Zusammenhang mit Ihrer filepath, in dem Sie diese Zeile hinzugefügt

So sollten Sie diese Zeile os.path.join(os.path.dirname(__file__)) in file.py schreiben. und dann run python file.py, Es funktioniert, weil es Ihren Dateipfad dauert.

+0

Diese Antwort ist korrekt. – foobarbecue

18

Ich löste es durch Datei als String zu behandeln, dh "__file__" setzen statt __file__

Das ist für mich gut funktioniert (zusammen mit den Anführungszeichen!):

wk_dir = os.path.dirname(os.path.realpath('__file__')) 
+6

Das funktioniert zwar, aber ich kann nicht verstehen warum. Warum wird '" __file __ "' zwischen Anführungszeichen anders behandelt als '__file__' ohne Anführungszeichen? – Gio

+3

Weil es nicht auf die fehlende globale Variable verweist. Stattdessen behandelt es die Zeichenfolge '__file__' als Teil des Pfades. – JoshVarty

+44

Diese Antwort ist bizarr und zeigt einen ernsten Mangel an Verständnis für Python. -1. – foobarbecue

1

Wenn alles, was Sie suchen ist, Ihr aktuelles Arbeitsverzeichnis os.getcwd() erhalten Sie das gleiche wie os.path.dirname(__file__), solange Sie nicht das Arbeitsverzeichnis an anderer Stelle in Ihrem Code geändert haben. os.getcwd() funktioniert auch im interaktiven Modus.

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

5

ich das gleiche Problem mit PyInstaller und Py2exe hatte so auf der FAQ über die Auflösung von cx-freeze ich kam.

Wenn Ihr Skript von der Konsole oder als Anwendung verwenden, wird die Funktionen im Folgenden liefern Sie die „Ausführungspfad“, nicht die „tatsächlichen Dateipfad“:

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

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

Ihre alte Linie (erste Frage):

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

Ersatz Ihrer Codezeile mit dem folgenden Schnipsel.

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, den Sie Ihre Anwendung auf den Pfad Ihres os hinzufügen könnten, könnte man es überall ohne das Problem ausführen, die Ihre Anwendung finden nicht in der Lage ist Daten/Konfigurationsdateien ist.

mit Python Getestet:

  • 3.3.4
  • 2.7.13
Verwandte Themen