如何在当前工作目录改变时在Python模块中使用相对路径?
我有一个Python模块,它需要用到模块目录下一个子目录里的资源。在Stack Overflow上找了一些相关的答案后,我找到了一种方法,可以让模块找到这些资源,代码大概是这样的:
import os
os.path.join(os.path.dirname(__file__), 'fonts/myfont.ttf')
当我在其他地方调用这个模块时,这个方法很好用,但如果我先改变了当前的工作目录再去调用模块,就会出问题。问题在于,__file__
的内容是一个相对路径,它没有考虑到我改变了目录这件事:
>>> mymodule.__file__
'mymodule/__init__.pyc'
>>> os.chdir('..')
>>> mymodule.__file__
'mymodule/__init__.pyc'
我该如何在__file__
中编码绝对路径,或者如果不行的话,我该如何在模块中访问我的资源,无论当前的工作目录是什么?谢谢!
2 个回答
2
在 lunaryorn的回答 的基础上,我在我的模块顶部保留了一个函数,用来构建多个路径。这样可以省去我重复输入 join
的麻烦。
def package_path(*paths, package_directory=os.path.dirname(os.path.abspath(__file__))):
return os.path.join(package_directory, *paths)
要构建路径,可以这样调用它:
font_file = package_path('fonts', 'myfont.ttf')
或者如果你只需要包的目录:
package_directory = package_path()
71
在模块的最开始,先保存模块目录的绝对路径:
package_directory = os.path.dirname(os.path.abspath(__file__))
然后,基于这个 package_directory
来加载你的资源:
font_file = os.path.join(package_directory, 'fonts', 'myfont.ttf')
最后,不要去修改全局的资源,比如当前的工作目录。在一个写得好的程序里,通常没有必要去改变工作目录,所以要避免使用 os.chdir()
。