__file__ 和 os.path 模块不兼容?

4 投票
2 回答
1450 浏览
提问于 2025-04-16 22:24
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

撰写回答