我刚刚设置了在 Python 2.6中使用 pytest。到目前为止,除了处理“ import”语句之外,它工作得很好: 我似乎无法让 pytest 像我的程序那样响应导入。
我的目录结构如下:
src/
main.py
util.py
test/
test_util.py
geom/
vector.py
region.py
test/
test_vector.py
test_region.py
要运行,我从 src/调用 python main.py
。
在 main.py 中,我用
from geom.region import Region
from geom.vector import Vector
在 vector.py 中,我用
from geom.region import Region
当我以标准运行方式运行代码时,这些都可以很好地工作。但是,当我从 src/调用“ py.test”时,它始终存在导入错误。
我的第一个问题是,当运行“ test/test _ foo.py”时,py.test 不能直接“ import foo.py”。我用“小恶魔”工具解决了这个问题。在“ test _ util.py”中:
import imp
util = imp.load_source("util", "util.py")
这对于许多文件都非常有效。它似乎还暗示,当 pytest 运行“ path/test/test _ foo.py”来测试“ path/foo.py”时,它基于目录“ path”。
但是,这对于“ test _ vector.py”是失败的。Pytest 可以查找和导入 vector
模块,但是它可以定位 vector
的任何导入。使用 pytest 时,以下导入(来自“ vector.py”)都会失败:
from geom.region import *
from region import *
这两者都给出了形式上的错误
ImportError: No module named [geom.region / region]
我不知道接下来要做什么来解决这个问题; 我对 Python 中导入的理解有限。
在使用 pytest 时,处理进口的正确方法是什么?
在 vector.py
中,我将 import 语句从
from geom.region import Region
变得简单
from region import Region
这使得导入相对于“ vector.py”目录。
接下来,在“ test/test _ vector.py”中,我将“ vector.py”目录添加到路径中,如下所示:
import sys, os
sys.path.append(os.path.realpath(os.path.dirname(__file__)+"/.."))
这使 Python 能够从“ geom/test/test _ vector.py”中找到“ . ./region.py”。
这可以工作,但是它似乎非常有问题,因为我正在向路径添加大量新目录。我要找的是
1)与 pytest 兼容的导入策略,或
2) pytest 中的一个选项,使其与我的导入策略兼容
所以我把这个问题留给这些类型的答案。