__file__和os.path模块打得不好?

时间:2011-07-28 02:27:29

标签: python module path

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可能被调用过?

编辑:我希望第二个例子可以更好地澄清我的问题

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 个答案:

答案 0 :(得分:1)

__file__必须存在sys.path某处。

for dirname in sys.path:
   if os.path.exists( os.path.join(dirname,__file__) ):
       # The directory name for `__file__` was dirname

答案 1 :(得分:1)

最后一个示例在__file__名称(./xxx.py)中有一个相对路径元素。调用abspath时,它会扩展到当前目录。

如果您将此代码放在模块中,则不会出现此问题。

相关问题