__file__ 和 os.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
我遇到了一个问题,就是在脚本中使用了 os.chdir
之后,dirname(__file__)
就不能再依赖了,因为在模块加载器设置了 __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 个回答
1
最后一个例子中,__file__
的名字里有一个相对路径的部分(./xxx.py
)。当你用 abspath
来处理这个路径时,它会被转换成当前目录的绝对路径。
如果你把这段代码放在一个模块里,就不会遇到这个问题了。
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