38

我有一个 Python 模块,它使用模块目录的子目录中的一些资源。在搜索堆栈溢出并找到相关答案后,我设法通过使用类似的方法将模块定向到资源

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__,或者除此之外,无论当前工作目录是什么,我如何访问模块中的资源?谢谢!

4

2 回答 2

67

将模块目录的绝对路径存储在模块的最开头:

package_directory = os.path.dirname(os.path.abspath(__file__))

之后,基于此加载您的资源package_directory

font_file = os.path.join(package_directory, 'fonts', 'myfont.ttf')

毕竟,不要修改进程范围的资源,如当前工作目录。在编写良好的程序中,从来没有真正需要更改工作目录,因此避免os.chdir().

于 2010-11-15T17:55:19.877 回答
2

基于lunaryorn 的回答,我在模块顶部保留了一个函数,我必须在其中构建多个路径。这节省了我重复输入joins 的时间。

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()
于 2020-08-04T12:42:26.173 回答