当CWD发生变化时,如何在Python模块中使用相对路径?

jvk*_*sch 29 python relative-path python-packaging

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

import os
os.path.join(os.path.dirname(__file__), 'fonts/myfont.ttf')
Run Code Online (Sandbox Code Playgroud)

当我从其他地方调用模块时这很好用,但是当我在更改当前工作目录后调用模块时,它会中断.问题是内容__file__是一个相对路径,没有考虑到我更改目录的事实:

>>> mymodule.__file__
'mymodule/__init__.pyc'
>>> os.chdir('..')
>>> mymodule.__file__
'mymodule/__init__.pyc'
Run Code Online (Sandbox Code Playgroud)

如何__file__编写绝对路径,或者禁止如何访问模块中的资源,无论当前工作目录是什么?谢谢!

lun*_*orn 50

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

package_directory = os.path.dirname(os.path.abspath(__file__))
Run Code Online (Sandbox Code Playgroud)

然后,根据以下内容加载资源package_directory:

font_file = os.path.join(package_directory, 'fonts', 'myfont.ttf')
Run Code Online (Sandbox Code Playgroud)

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