Это может показаться вопросом новичка, но это не так. Некоторые общие подходы работают не во всех случаях:
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 - Найти путь к файлу, который выполняется
- Путь к текущему файлу зависит от того, как я выполняю программу
- Как узнать путь запуска скрипта в Python?
- Изменить каталог на каталог скрипта Python
Я ищу общее решение , которое будет работать во всех вышеупомянутых случаях использования.
Обновить
Вот результат теста:
Вывод 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
NameError: global name '__file__' is not defined
использую файл, и это не внутри IDLE. Подумайте, что__file__
определяется только внутри модулей.