Wenn ich diesen Code in Python 2.7 ausführe, wird folgende Fehlermeldung angezeigt:
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']
)
file.py
ein Skript auszuführen , müssen Sie es beispielsweise im selben Verzeichnis wie Ihr Skript ablegen. Sie müssen also vor dem Ausführen in dieses Verzeichnis wechselnfile.py
... Es wird also immer noch nach etwas Besserem gesucht.Ich hatte das gleiche Problem mit PyInstaller und Py2exe, daher bin ich auf die Auflösung in den FAQ von cx-freeze gestoßen.
Wenn Sie Ihr Skript über die Konsole oder als Anwendung verwenden, liefern Ihnen die folgenden Funktionen den "Ausführungspfad" und nicht den "tatsächlichen Dateipfad":
Quelle:
http://cx-freeze.readthedocs.org/en/latest/faq.html
Ihre alte Zeile (erste Frage):
Ersetzen Sie Ihre Codezeile durch das folgende Snippet.
Mit dem obigen Code können Sie Ihre Anwendung zum Pfad Ihres Betriebssystems hinzufügen und sie überall ausführen, ohne das Problem, dass Ihre App ihre Daten- / Konfigurationsdateien nicht finden kann.
Getestet mit Python:
quelle
Ändern Sie Ihre Codes wie folgt! Für mich geht das. `
quelle
os.getcwd()
, laut doc , und das"__file__"
ist bedeutungslos.__file__
" und stellen vor, in welchem Ordner sie sich befinden könnte, wenn sie existiert!Ich bin auf Fälle gestoßen, in denen
__file__
es nicht wie erwartet funktioniert. Aber Folgendes hat mich bisher nicht enttäuscht:Dies kommt einem Python-Analogon zu C am nächsten
__FILE__
.Das Verhalten von Pythons
__file__
ist ganz anders als C ist__FILE__
. Die C-Version gibt Ihnen den ursprünglichen Pfad der Quelldatei. Dies ist nützlich, um Fehler zu protokollieren und zu wissen, welche Quelldatei den Fehler aufweist.Python
__file__
gibt Ihnen nur den Namen der aktuell ausgeführten Datei an, was bei der Protokollausgabe möglicherweise nicht sehr nützlich ist.quelle
os.path.dirname(os.path.realpath(...))
Methode.Verwenden Sie den interaktiven Interpreter? Sie können verwenden
Sie sollten lesen: Wie erhalte ich den Pfad der aktuell ausgeführten Datei in Python?
quelle
argv[1]
stattargv[0]
Ich habe es gelöst, indem ich die Datei als Zeichenfolge behandelt habe, dh
"__file__"
(zusammen mit den Anführungszeichen!) Statt__file__
Das funktioniert gut für mich:
quelle
"__file__"
zwischen Anführungszeichen anders behandelt als__file__
ohne Anführungszeichen?"__file__"
. ZBrealpath('nonexistentfile.whatever')
.Wenn Sie nur nach Ihrem aktuellen Arbeitsverzeichnis suchen, erhalten
os.getcwd()
Sie dasselbe,os.path.dirname(__file__)
solange Sie das Arbeitsverzeichnis an keiner anderen Stelle in Ihrem Code geändert haben.os.getcwd()
funktioniert auch im interaktiven Modus.So
os.path.join(os.path.dirname(__file__))
wirdos.path.join(os.getcwd())
quelle
os.path.dirname(__file__)
meldet nicht dasselbe wieos.getcwd()
. Was es Ihnen gibt, ist der Verzeichnisname der Datei. Wenn sich herausstellt, dass das passt, istos.getcwd()
es nur ein Zufall.Sie erhalten dies, wenn Sie die Befehle über die Python-Shell ausführen:
Sie müssen die Datei direkt ausführen, indem Sie sie als Argument an den
python
Befehl übergeben:In deinem Fall sollte es wirklich so sein
python setup.py install
quelle
Was Sie tun können, ist Folgendes zu verwenden
Beachten Sie hier, dass sich die Verwendung der Zeichenfolge
'__file__'
tatsächlich auf die tatsächliche Variable bezieht__file__
. Sie können dies 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. um es zu testen / zu entwickeln) und es über die Befehlszeile ausführen können
quelle
'__file__'
um einen gültigen Variablennamen handelt und Ihreif
Bedingung erfüllt ist,os.path.realpath('__file__')
wird ein gefälschter Pfad zurückgegeben, der so behandelt wird,'__file__'
als wäre es der Name der Datei. Wenn Sie nur das übergeordnete Verzeichnis über benötigen, istos.path.dirname()
alles in Ordnung - aber das ist ein "Hack". @zwep__file__
aus einer Quelldatei heraus referenzieren, erhalten Sie den Pfad der Datei, in der sie verwendet wird - es ist nicht dasselbe wieos.getcwd()
. Es wird nicht immer Ihrwk_dir
- oder Arbeitsverzeichnis sein.Wenn Sie eine Datei über die Befehlszeile ausführen, können Sie diesen Hack verwenden
Dies funktionierte für mich in der UnrealEnginePython-Konsole beim Aufrufen
py.exec myfile.py
quelle
Ich hatte das gleiche Problem im Jupyter-Notizbuch. Während ich 'os.path.split (os.path.realpath ( file ))' verwendet habe, hat das Notizbuch einen Fehler ausgegeben .
Ich habe also ' Datei ' verwendet. Es hat perfekt funktioniert.
quelle
Ich habe genau das gleiche Problem und benutze wahrscheinlich das gleiche Tutorial . Die Funktionsdefinition:
ist fehlerhaft, da
os.path.dirname(__file__)
wird nicht zurückgeben, was Sie brauchen. Versuchen Sie ersetzenos.path.dirname(__file__)
mitos.path.dirname(os.path.abspath(__file__))
:Ich habe gerade Andrew gepostet, dass das Code-Snippet in aktuellen Dokumenten nicht funktioniert, hoffentlich wird es korrigiert.
quelle