这是一个经常以不同形式提出的问题,通常会得到“大声笑,您做得不好”的回答。可以肯定的是,这是因为有人(包括我在内)正在尝试将其用作实现,并且解决方案并不明显(如果您以前没有这样做过)。
会接受“让蝇从瓶子里飞出来”的答案。
给定
project/
__init__.py
/code
__init__.py
sut.py
/tests
__init__.py
test_sut.py
tests_sut.py开始的位置:
import code.sut
在根目录中运行鼻子测试会导致:
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)似乎是首选。
无论如何,以下建议采用首选解决方案的陈述将消除我自己的“不自然”感觉。
您已经很好地回答了您的问题。.D(安装到系统位置)是可分发代码的首选。我通常使用C(修改sys.path),因为我不希望在系统范围内安装数百个自定义库。从理论上讲,A(相对导入)似乎更好,但是在某些情况下它会失败。B(PYTHONPATH)是正确的,我认为实际上仅用于测试目的。
这几乎总结了所有选项。您偏爱的选项(Python神奇地知道在哪里寻找)实际上不是可行的解决方案,因为它可能导致无法预测的结果,例如从不相关的项目中自动查找库。
我认为,最好的办法是将其放在程序的入口点:
import sys, os
sys.path = [os.path.abspath(os.path.dirname(__file__))] + sys.path
问题内容: 我是Python的新手,因为我想扩展使用R学习的技能。在RI中,往往会加载一堆库,有时会导致函数名冲突。 什么是Python最佳实践。我看到了一些特定的变体,但我看不出它们之间的区别 ,和 前两者之间有什么区别,我应该只导入我需要的东西吗?同样,对于制作小型程序来处理数据和计算简单统计信息的人来说,最糟糕的后果是什么。 更新 我找到了这个出色的指南。它解释了一切。 问题答案: 在pan
问题内容: 我似乎无法获得鼻子测试框架来识别文件结构中测试脚本下的模块。我设置了最简单的示例来演示该问题。我会在下面解释。 这是包文件的结构: foo.py包含: tests / test_foo.py包含: 两个 init .py文件均为空 如果我在主目录(foo.py所在的目录)中运行,则会得到: 当我从tests /目录中运行时,出现相同的错误。根据文档和我发现的示例,nose应该将所有父包
问题内容: 已经使用了平面软件包,我没想到嵌套软件包会遇到这个问题。这是… init .py的内容 这两个和是空的。 内容 内容(3个版本) 版本1 这是导入事物的坏方法和不安全方法(批量导入所有内容),但是它可以工作。 版本2 一种逐项导入的更安全的方法,但是失败了,Python不希望这样:失败,并显示消息:“没有名为模块的模块”。但是…… ……说。所以这是一个模块,但不是一个模块/ -P 8-
问题内容: 我可能会丢失一些显而易见的东西,但是无论如何: 当您像在python中那样导入软件包时,您可以直接使用任何子模块/子软件包。例如,这有效: 但是我有自己的软件包,其结构如下: 并且这里相同的逻辑不起作用: 我究竟做错了什么? 问题答案: 您需要导入子模块: 您正在寻找的是。您可以通过将(或)放入来解决它,然后Python就能在其中找到。但我建议使用我的第一个建议。
问题内容: 我已尝试找到有关最佳使用还是全面的指南。我刚开始使用Python,并且正在尝试着眼于最佳实践。 基本上,我希望有人能分享他们的经验,其他开发人员有什么喜好,以及避免遇到麻烦的最佳方法是什么? 问题答案: 和之间的区别主要是主观的。选择最喜欢的一个,并在使用中保持一致。这里有一些要点可以帮助你做出决定。 优点: - 减少维护你的import报表。无需添加任何其他导入即可开始使用模块中的另
问题内容: 我正在通过Anaconda 2.1.0发行版使用scipy和numpy。我使用Spyder作为我的Python IDE。 当我运行时 ,我无法通过以下方式访问子包,例如optimize,linalg,cluster等。 但是,运行时,我可以通过访问所有子包,例如linalg,random,matrixlib,多项式,测试等。 两种进口的工作方式不同,是否有原因?为什么不将所有scipy