我正在使用py.test
来测试我的python代码。我项目的相关结构是
-myproject
file.py
file2.py
-test/
input.txt
input2.dat
test_part.py
-regress/
file2_old.py
__init__.py
-test/
test_file2_regression.py
test_part.py
导入file
和file2
以及test_file2_regression.py
导入file2
和regress.file2_old
。如果我在控制台中运行pytest
,则会收到导入错误,导致包不存在。另一方面,运行python -m pytest
非常合适,但只有当我从myproject/
目录运行它时才会运行。
这样做的正确方法是什么,让它在项目的任何地方运行?我已经尝试修改PYTHONPATH
但我真的不知道如何正确地做到这一点。
更多信息:
我没有任何设置文件,我的__init__
只是空文件。如果需要操纵PYTHONPATH
,则需要相对于myproject
进行操作,因为我在多台机器上使用它。我正在运行python 2.7。
我已经退房了:
但它并没有真正帮助我。
答案 0 :(得分:2)
与项目中任何目录的pytest
命令一起使用的解决方案是在test*.py
文件中的导入之前包含:
import os
from sys import path
PATH = os.path.abspath(os.path.dirname(__file__))
path.append(os.path.join(PATH, os.pardir, os.pardir))
使用适当数量的os.pardir
导航到项目目录,__init__.py
文件允许导入模块。
argv[0]
和inspect.getsourcefile
都没有提供必要的信息。 argv[0]
包含已使用的py.test
模块的位置,而getsourcefile
方法只返回None
。
答案 1 :(得分:1)
在搜索“最好的方法”时遇到了同样的问题和类似的成功,我总结了自己尽可能避免这种情况(通过从顶层运行实际脚本),但回答你的问题,我当前的方法(例如从并行文件夹进行单元测试)是
from sys import argv, path
from os.path import dirname, join
path.append(join(dirname(argv[0]), ".."))
这使得解释器还可以在上面启动脚本的文件夹中进行搜索。另一种方法(而不是使用argv
)是使用introspect
模块来获取文件名。这些对我来说比使用__file__
更好,因为后者并不总是被定义。
编辑29.10。:
argv[0]
的替代方法是使用
from inspect import getsourcefile
from sys import path
from os.path import dirname, join
this_file = getsourcefile(lambda _: None)
path.append(join(dirname(this_file), ".."))
我希望这至少可以满足要求的目的,另请参阅How do I get the path of the current executed file in Python?。
最简单的 - 如果它适用于您的情况 - 当然是:
from os.path import dirname, join
path.append(join(dirname(__file__), ".."))