这是一个经常以不同形式被问到的问题,通常得到的回答是“哈哈,你做得不对”。我很确定这是因为人们(包括我)都在尝试使用一个常识场景作为实现,而解决方案并不明显(如果你以前没有这样做过)。
会接受一个“让苍蝇飞出瓶子”的回答。
给定的
project/
__init__.py
/code
__init__.py
sut.py
/tests
__init__.py
test_sut.py
tests_sut.py开始的位置:
import code.sut
在根目录中运行nosetests会导致:
ImportError: No module named code.sut
走过的道路:
a)使用
from ..code import sut
b)将项目的根添加到PYTHONPATH
c)使用
sys.path.append
要添加..每个测试模块开始处的导入之前的路径。
d)只需记住做一个
setup.py
在运行测试之前,在项目上将模块安装到站点包中。
因此,要求测试位于测试包根目录下,这些测试可以访问项目。以上每一项对我来说都不是“自然”的,都被证明是有问题的,或者看起来像是太难的工作!
在java中,这是可行的,但基本上是借助于构建工具/ IDE将所有类放在类路径中。也许问题是我期待的是Python的“魔力”?在Flask webframework测试中指出,选项d)似乎是首选的。
在任何情况下,下面推荐一个首选解决方案的声明将消除我自己的“不自然”的感觉。
发布于 2011-07-13 04:37:43
你已经很好地回答了你的问题..D(安装到系统位置)是可分发代码的首选。我通常使用C (modify sys.path),因为我不想在系统范围内安装数百个自定义库。在理论上A(相对导入)似乎更好,但也有失败的情况。B (PYTHONPATH)是正确的,在我看来,实际上只是为了测试目的。
这几乎总结了所有的选择。您喜欢的选项(Python神奇地知道在哪里查找)实际上不是一个可行的解决方案,因为它可能导致不可预测的结果,例如自动从不相关的项目中查找库。
在我看来,最好的做法是将它放在程序的入口点:
import sys, os
sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path
发布于 2013-09-18 14:00:42
我知道有一个答案,我仍然认为这是一个很好的理由来分享其他选择:)
有一个nose-pathmunge让您可以在调用nosestests
时设置sys.path
。
https://stackoverflow.com/questions/6670275
复制相似问题