当前位置: 首页 > 面试题库 >

Python导入以使用鼻子进行测试-在当前软件包之上导入模块的最佳做法是

锺星洲
2023-03-14
问题内容

这是一个经常以不同形式提出的问题,通常会得到“大声笑,您做得不好”的回答。可以肯定的是,这是因为有人(包括我在内)正在尝试将其用作实现,并且解决方案并不明显(如果您以前没有这样做过)。

会接受“让蝇从瓶子里飞出来”的答案。

给定

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