从非当前目录打开非py文件的正确和故障安全方法是什么?
更具体地说,我有一个方法,它使用JSON模式验证API响应,包含在文件 schema.json 中:
def foo():
json_data = collect_json_data()
schema = json.load(open('./schema/schema.json'))
jsonschema.validate(json_data, schema)
获得以下项目结构:
D:\projects\project-pytest\.
│ .gitignore
│ LICENSE
│ README.md
│ requirenments.txt
│ runner_01.cmd
│ structure.txt
│
├───tests
│ │ runner_02.cmd
│ │ file_with_tests.py
│ │
│ ├───schema
│ │ schema.json
我的目标是不仅通过exectuting命令project-pytest\tests\
从目录python -m pytest file_with_tests.py
运行测试,还通过执行runner_01.cmd
从父目录运行测试,命令python -m pytest -v .\tests\file_with_tests.py
。
现在第二种方式失败了FileNotFoundError: [Errno 2] No such file or directory: './schema/schema.json'
。
我尝试使用import os
:
schema_path = os.path.abspath('schema.json')
schema = json.load(open(schema_path))
但在这种情况下,绝对路径会忽略schema.json
父目录 - FileNotFoundError: [Errno 2] No such file or directory: 'D:\\Git\\testarea-pytest\\schema.json'
。
我应该如何打开位于不同子目录中的schema.json
并能够运行命令:
来自python -m pytest -v .\tests\file_with_tests.py
文件夹的project-pytest
和
来自python -m pytest -v file_with_tests.py
文件夹的project-pytest\tests\
因FileNotFoundError
而没有失败的测试。
答案 0 :(得分:0)
如果您乐意将项目作为包,pkgutil.get_data()
可以帮助从文件系统中的资源位置进行抽象。
请参阅here.
答案 1 :(得分:0)
修复了从另一方实现目标的问题 - 我改变了我的runner_01.cmd
:
python -m pytest -v file_with_tests.py
到此:
cd ./tests/
python -m pytest -v file_with_tests.py
现在可以从项目文件夹运行测试,也可以通过简单的cmd脚本运行器从tests文件夹运行测试。无法定义地说这是一个无用的,但用户很高兴。