Это может показаться вопросом новичка, но это не так. Некоторые общие подходы работают не во всех случаях:
sys.argv [0]
Это означает использование path = os.path.abspath(os.path.dirname(sys.argv[0]))
, но это не работает, если вы запускаете из другого скрипта Python в другом каталоге, и это может случиться в реальной жизни.
__ файл __
Это означает использование path = os.path.abspath(os.path.dirname(__file__))
, но я обнаружил, что это не работает:
py2exe
не имеет атрибута __file__
, но есть обходной путь
- При запуске из IDLE с
execute()
отсутствует атрибут __file__
- OS X 10.6, где я получаю
NameError: global name '__file__' is not defined
Похожие вопросы с неполными ответами:
Я ищу универсальное решение , которое будет работать во всех описанных выше случаях использования.
Обновление
Вот результат теста:
Вывод python a.py (в 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")
подкаталог / 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
дерево
C:.
| a.py
\---subdir
b.py