为了设置一些路径来访问我的应用程序的子目录(如 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]
不再匹配 myapp,测试脚本无法访问 data/
。
我想知道如何处理这个,例如:
- 有没有办法从我的应用程序和测试套件中获取相同的根目录?
- 或者,我是否应该只为我的应用程序保留
settings.py
,并为测试套件提供正确的(硬编码的)rootdir? - 或者在配置文件中定义一个
installdir
,它将在安装期间设置,然后由我的应用程序(而不是上面的代码片段)及其测试套件使用? - 我也考虑过将
sys.argv[0]
替换为'myappname'
,但是,由于有不同的目录具有相同的名称,因此不确定是否可以正确的那一个。 (另外,如果在另一个地方有一个安装版本和一个开发版本怎么办:如何区分它们?)
那么,处理这个问题的最佳方法是什么?
最佳答案
所以通常要做的是 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 来访问它。
关于python - 如何在测试中正确设置相对于运行脚本的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37583625/