Update 2018-11-28:
Hier ist eine Zusammenfassung der Experimente mit Python 2 und 3. Mit
main.py - führt foo.py aus
foo.py - führt lib / bar.py
lib / bar.py aus - druckt Dateipfadausdrücke
| Python | Run statement | Filepath expression |
|--------+---------------------+----------------------------------------|
| 2 | execfile | os.path.abspath(inspect.stack()[0][1]) |
| 2 | from lib import bar | __file__ |
| 3 | exec | (wasn't able to obtain it) |
| 3 | import lib.bar | __file__ |
Für Python 2 ist es möglicherweise klarer, zu Paketen zu wechseln, um diese zu verwenden. from lib import bar
Fügen Sie einfach leere __init__.py
Dateien zu den beiden Ordnern hinzu.
Für Python 3 execfile
gibt es keine - die nächste Alternative ist exec(open(<filename>).read())
, obwohl dies die Stapelrahmen betrifft. Es ist am einfachsten zu verwenden import foo
und import lib.bar
- keine __init__.py
Dateien erforderlich.
Siehe auch Unterschied zwischen Import und Execfile
Ursprüngliche Antwort:
Hier ist ein Experiment, das auf den Antworten in diesem Thread basiert - mit Python 2.7.10 unter Windows.
Die stapelbasierten sind die einzigen, die zuverlässige Ergebnisse zu liefern scheinen. Die letzten beiden haben die kürzeste Syntax , dh -
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
Hier ist, dass diese als Funktionen zu sys hinzugefügt werden! Gutschrift an @Usagi und @pablog
Basierend auf den folgenden drei Dateien und Ausführen von main.py aus dem Ordner mit python main.py
(auch Execfiles mit absoluten Pfaden ausprobiert und Aufruf aus einem separaten Ordner).
C: \ Dateipfade \ main.py: execfile('foo.py')
C: \ Dateipfade \ foo.py: execfile('lib/bar.py')
C: \ Dateipfade \ lib \ bar.py:
import sys
import os
import inspect
print "Python " + sys.version
print
print __file__ # main.py
print sys.argv[0] # main.py
print inspect.stack()[0][1] # lib/bar.py
print sys.path[0] # C:\filepaths
print
print os.path.realpath(__file__) # C:\filepaths\main.py
print os.path.abspath(__file__) # C:\filepaths\main.py
print os.path.basename(__file__) # main.py
print os.path.basename(os.path.realpath(sys.argv[0])) # main.py
print
print sys.path[0] # C:\filepaths
print os.path.abspath(os.path.split(sys.argv[0])[0]) # C:\filepaths
print os.path.dirname(os.path.abspath(__file__)) # C:\filepaths
print os.path.dirname(os.path.realpath(sys.argv[0])) # C:\filepaths
print os.path.dirname(__file__) # (empty string)
print
print inspect.getfile(inspect.currentframe()) # lib/bar.py
print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\filepaths\lib
print
print os.path.abspath(inspect.stack()[0][1]) # C:\filepaths\lib\bar.py
print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\filepaths\lib
print
__file__
Attribut absolut oder relativ?