【发布时间】:2011-10-14 18:33:06
【问题描述】:
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 之后,在模块加载器设置__file__ 之后,不再依赖dirname(__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
【问题讨论】:
-
无法在 Windows 7、Python 2.6.2 上重现。目录切换是否重要,或者是否有任何目录这样做?必须导入文件,还是可以单独运行?你使用的是什么 Python 版本?第二次到底是怎么“坏”的(什么不符合预期)?
-
“解决这个问题的常用机制是什么”?什么?为什么
__file__的绝对路径是什么?为什么要等到“不知道以前可能在哪里/何时/如何调用 os.chdir”之后才获得绝对路径? -
对不起,原因是用于调试辅助函数。我使用inspect模块来获取一堆其他信息,例如,我可以使用
dbgp('i')而不是乱扔代码dbgp('i')并获得不同颜色的输出行,例如/abs/path/to_file.py:line_number i = repr(i) -
@Cameron,我很抱歉我在第一个例子中不是很清楚。我已经在第二次编辑中回答了你的问题。
-
那么您的最终目标是更好/更好的调试输出吗?