python - 从非当前目录打开非py文件的正确和故障安全方法

时间:2018-02-06 19:29:14

标签: python file cmd import pytest

从非当前目录打开非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而没有失败的测试。

2 个答案:

答案 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文件夹运行测试。无法定义地说这是一个无用的,但用户很高兴。