如何在测试中正确设置相对于 运行 脚本的路径?

How to correctly setup a path relative to running script also in tests?

为了设置一些路径来访问我的应用程序的子目录(如 locale/),我在 settings.py:

中使用了它
__process_name = os.path.basename(sys.argv[0])
__abspath = os.path.abspath(sys.argv[0])
__l1 = len(__process_name)
__l2 = len(__abspath)
rootdir = __abspath[:__l2-__l1]

然后,例如访问 data/:

datadir = rootdir + "data/"

问题是,当我 运行 这个 settings.py 当我 运行 测试(例如 python3 -m py.test)时,然后 sys.argv[0] 与我的应用程序不匹配不再,测试脚本无法访问 data/.

不知如何处理,例如:

那么,处理这个问题的最佳方法是什么?

所以通常的做法是os.path.dirname(os.path.abspath(__file__))

__file__ 是当前模块的路径,os.path.abspath 确保它是绝对的,os.path.dirname 给你它的目录部分。

如果您有一个模块作为包的一部分并且需要例如包中的目录,您可以根据需要使用 os.path.join(..., os.pardir),或者如果可能的话导入包(即它的 __init__.py)并执行 your_package.__file__.

您可能还想考虑的替代方法是使用设置工具将您的数据指定为包数据,然后使用 pkg_resources API 访问它。