【问题标题】:__file__ and os.path module not playing nicely?__file__ 和 os.path 模块玩得不好?
【发布时间】: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,我很抱歉我在第一个例子中不是很清楚。我已经在第二次编辑中回答了你的问题。
  • 那么您的最终目标是更好/更好的调试输出吗?

标签: python module path


【解决方案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

【讨论】:

  • __file__ 中的同一个文件名不能在sys.path 中存在多次吗?
  • @wim:是的。它可能。所以? Python 在加载时按顺序搜索 sys.path。您正在以相同的顺序进行搜索。
  • 这基本上是正确的。但是,有一种特殊情况,__file__ 是绝对路径,os.path.exists(dirname,__file__) 返回 True,因为来自sys.path[0]dirname''(空字符串)。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-04-04
    • 2011-06-15
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2015-09-29
    相关资源
    最近更新 更多