To może wydawać się pytaniem dla początkujących, ale tak nie jest. Niektóre typowe podejścia nie działają we wszystkich przypadkach:
sys.argv [0]
Oznacza to używanie path = os.path.abspath(os.path.dirname(sys.argv[0]))
, ale to nie działa, jeśli uruchamiasz z innego skryptu Python w innym katalogu, co może się zdarzyć w prawdziwym życiu.
__plik__
Oznacza to używanie path = os.path.abspath(os.path.dirname(__file__))
, ale stwierdziłem, że to nie działa:
py2exe
nie ma__file__
atrybutu, ale istnieje obejście- Po uruchomieniu z IDLE
execute()
bez__file__
atrybutu - OS X 10.6, gdzie dostaję
NameError: global name '__file__' is not defined
Powiązane pytania z niepełnymi odpowiedziami:
- Python - Znajdź ścieżkę do uruchamianego pliku
- Ścieżka do bieżącego pliku zależy od tego, jak wykonam program
- Jak poznać ścieżkę działającego skryptu w Pythonie?
- Zmień katalog na katalog skryptu Python
Szukam ogólnego rozwiązania , które działałoby we wszystkich powyższych przypadkach użycia.
Aktualizacja
Oto wynik przypadku testowego:
Dane wyjściowe Python a.py (w systemie Windows)
a.py: __file__= a.py
a.py: os.getcwd()= C:\zzz
b.py: sys.argv[0]= a.py
b.py: __file__= a.py
b.py: os.getcwd()= C:\zzz
a.py
#! /usr/bin/env python
import os, sys
print "a.py: sys.argv[0]=", sys.argv[0]
print "a.py: __file__=", __file__
print "a.py: os.getcwd()=", os.getcwd()
print
execfile("subdir/b.py")
subdir / b.py
#! /usr/bin/env python
import os, sys
print "b.py: sys.argv[0]=", sys.argv[0]
print "b.py: __file__=", __file__
print "b.py: os.getcwd()=", os.getcwd()
print
drzewo
C:.
| a.py
\---subdir
b.py
NameError: global name '__file__' is not defined
używam pliku i nie ma go w IDLE. Pomyśl, że__file__
jest zdefiniowane tylko w modułach.