Це може здатися питанням для новачків, але це не так. Деякі поширені підходи працюють не у всіх випадках:
sys.argv [0]
Це означає використовувати path = os.path.abspath(os.path.dirname(sys.argv[0]))
, але це не працює, якщо ви працюєте з іншого сценарію Python в іншому каталозі, і це може статися в реальному житті.
__file__
Це означає використовувати 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")
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
дерево
C:.
| a.py
\---subdir
b.py
NameError: global name '__file__' is not defined
використовую файл, і це не знаходиться всередині IDLE. Подумайте, що__file__
визначено лише всередині модулів.