Python使用鼻子导入testing – 在当前软件包上导入模块的最佳做法是什么

这是一个经常以不同forms提出的问题,经常会得到“哈哈,你做得不好”的反应。 可以肯定的是,这是因为人们(包括我)试图用作实现的常识情况,解决scheme并不明显(如果以前没有这样做的话)。

会接受“让飞出瓶子”的答案。

特定

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 

在每个testing模块开始时的导入之前添加..path。

d)只记得做一个

 setup.py 

在运行testing之前将模块安装到站点包中。


所以要求testing位于可以访问项目的testing包根目录下。 上面的每个人都不觉得“自然”,已经certificate有问题,或者看起来像太辛苦了!

在Java中,这个工作,但基本上是由你的构build工具/ IDE的所有类放在类path。 也许问题是我期待Python的“魔力”? 在Flask webframeworktesting中注意到,选项d)似乎是首选。

无论如何,下面推荐一个首选解决scheme的陈述将会消除我自己的“不自然”的感觉。

您已经很好地回答了您的问题。D(安装到系统位置)对于可分发代码是首选。 我通常使用C(修改sys.path),因为我不希望我的数百个自定义库的系统范围的安装。 从理论上讲,一个(相对import)似乎更好,但也有一些失败的情况。 B(PYTHONPATH)是正确的,真的只是为了testing目的,在我看来。

这几乎总结了所有的select。 你喜欢的选项(Python神奇地知道在哪里看)实际上不是一个可行的解决scheme,因为它可能导致不可预知的结果,如从不相关的项目自动寻找库。

在我看来,最好的办法是把它放在你程序的入口处:

 import sys, os sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path 

我有同样的问题,并find一个相关的问题为我工作的答案 。

只要删除项目根目录中的__init__.py。

我知道有一个答案检查,我仍然认为这是一个很好的理由来分享其他的select:)

有一个鼻子path给你一个控件来设置sys.path同时调用nosestests