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

标签 python python-3.x testing relative-path pytest

为了设置一些路径来访问我的应用程序的子目录(如 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/

相关文章:

python - Django 单复选框调查问卷

python - 由于numpy,Python脚本无法与Windows任务计划程序一起运行

python - 如何在特定时间暂停或停止 python 程序(不基于耗时!)

python-3.x - 当输出标签是3D数组时如何使用SVM?

javascript - 与 Git/GitHub 协作使用 Node 测试代码

python - 如何在 Dash/Plotly 应用程序中自动为多个图形添加回调

python - Pika BlockingConnection 和 RabbitMQ : connection closed

python - 从 PyParsing 中的多行引号字符串中删除\n

sharepoint - TFS 基于需求的套件在 MTM 中显示为测试套件或 Web 访问测试套件——它们是可配置的 SharePoint 列表吗?

java - Java中的随机测试