【发布时间】:2014-11-07 17:55:24
【问题描述】:
我刚刚准备好在 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 无法直接“导入 foo.py”。我通过使用“imp”工具解决了这个问题。在“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 的任何导入。以下导入(来自“vector.py”)在使用 pytest 时均失败:
from geom.region import *
from region import *
这些都给出了形式的错误
ImportError: No module named [geom.region / region]
我不知道下一步该怎么做才能解决这个问题;我对 Python 中的导入的理解有限。
使用 pytest 时处理导入的正确方法是什么?
编辑:极其骇人的解决方案
在vector.py 中,我将导入语句从
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 中的一个选项,使其与我的导入策略兼容
所以我将这个问题留给这些类型的答案。
【问题讨论】:
-
我仍在寻找兼容 py.test 的导入策略:/
-
@Zelphir python -m pytest tests/ 工作正常。
-
@ederag 如果我这样做,在我的项目中,python 找不到测试用例使用的所有其他导入(或测试用例中使用的导入类/模块)。如果我将它们更改为绝对导入,我可以使用您的命令运行测试,但是当我尝试运行程序时它没有找到导入 - 导入语句的无休止循环更改,我不知道如何修复它.
-
在你的主包中也推荐绝对导入。请参阅stackoverflow.com/q/4209641/3565696 的答案。但请记住在您的目录中添加
__init__.py文件,以创建regular package。 (我从未尝试过使用命名空间包) -
您提到,“当我在标准运行中运行代码时,这些都可以正常工作。”你能准确描述一下你是如何开始“标准运行”的吗?这将让我们弄清楚在“标准运行”开始时如何配置
sys.path。