__file__ и модуль os.path не играют нормально? - PullRequest
4 голосов
/ 28 июля 2011
import os
print __file__
print os.path.dirname(__file__)
os.chdir('/tmp')
print __file__  # unchanged, of course
print os.path.dirname(__file__)  # now broken

У меня есть эта проблема выше, когда на dirname(__file__) больше нельзя положиться после того, как os.chdir было использовано в скрипте, после того, как загрузчик модуля установил __file__.

Каков обычный механизм для решения этой проблемы, при условии, что вы, возможно, не знаете, где / когда / как os.chdir могли быть вызваны ранее?

edit: iнадеюсь, что этот второй пример может лучше прояснить мою проблему

import os
old_dir = os.getcwd()
print os.path.abspath(__file__)
os.chdir('/tmp')
print os.path.abspath(__file__)
os.chdir(old_dir)

вывод выглядит так:

wim@wim-acer:~$ python --version
Python 2.7.1+
wim@wim-acer:~$ pwd
/home/wim
wim@wim-acer:~$ python /home/wim/spam.py
/home/wim/spam.py
/home/wim/spam.py
wim@wim-acer:~$ python ./spam.py
/home/wim/spam.py
/tmp/spam.py

Ответы [ 2 ]

1 голос
/ 28 июля 2011

В последнем примере есть относительный элемент пути в имени __file__ (./xxx.py).Когда вызывается abspath, он расширяется до текущего каталога.

Если вы поместите этот код в модуль, у вас не будет этой проблемы.

1 голос
/ 28 июля 2011

__file__ должен существовать где-то в sys.path.

for dirname in sys.path:
   if os.path.exists( os.path.join(dirname,__file__) ):
       # The directory name for `__file__` was dirname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...