Python模块和Python包之间有什么区别?
另请参阅:"package"和"module"之间的区别(对于其他语言)
我使用easy_install在mac上安装pytest并开始为具有文件结构的项目编写测试,如下所示:
repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py
Run Code Online (Sandbox Code Playgroud)
py.test在repo目录中运行时,一切都按预期运行
但是当我在linux或windows上尝试相同的东西时(两者都有pytest 2.2.3),每当它从我的应用程序路径首次导入某些东西时就会吠叫.比如说from app import some_def_in_app
我是否需要编辑我的PATH才能在这些系统上运行py.test?有没有人经历过这个?
我想知道在Python应用程序中导入包的首选方法.我有这样的包结构:
project.app1.models
project.app1.views
project.app2.models
Run Code Online (Sandbox Code Playgroud)
project.app1.views进口project.app1.models和project.app2.models.有两种方法可以实现这一点.
绝对进口:
import A.A
import A.B.B
Run Code Online (Sandbox Code Playgroud)
或者使用PEP 328在Python 2.5中引入的显式相对导入:
# explicit relative
from .. import A
from . import B
Run Code Online (Sandbox Code Playgroud)
什么是最pythonic的方式来做到这一点?
我正在尝试使用Pytest测试一个较大的项目(〜100k LOC,1k个文件),最终我还有其他几个类似的项目。这不是标准的Python包 ; 它是高度定制的系统的一部分,至少在短期内,我几乎无权更改。测试模块与代码集成在一起,而不是放在单独的目录中,这对我们很重要。配置与此问题相当相似,我在那里的回答也可能提供有用的背景。
我遇到的问题是,这些项目几乎只使用PEP 420隐式名称空间包;也就是说,__init__.py任何软件包目录中几乎没有文件。我还没有看到必须将其作为名称空间软件包的情况,但是鉴于此项目与其他也具有Python代码的项目结合在一起,这种情况可能会发生(或者已经发生,而我只是没有注意到) 。
考虑一个如下所示的存储库。(对于它的可运行副本,包括下面描述的测试,请0cjs/pytest-impl-ns-pkg从GitHub进行克隆。)假定以下所有测试都在中project/thing/thing_test.py。
repo/
project/
util/
thing.py
thing_test.py
Run Code Online (Sandbox Code Playgroud)
我对测试配置有足够的控制权,我可以确保 sys.path对输入的设置进行适当设置,以使被测代码能够正常工作。也就是说,以下测试将通过:
def test_good_import():
import project.util.thing
Run Code Online (Sandbox Code Playgroud)
但是,Pytest正在使用其通常的系统从文件中确定包名称,给出的包名称不是用于我的配置的标准包名称,并将项目的子目录添加到中sys.path。因此,以下两个测试失败:
def test_modulename():
assert 'project.util.thing_test' == __name__
# Result: AssertionError: assert 'project.util.thing_test' == 'thing_test'
def test_bad_import():
''' While we have a `project.util.thing` deep in our hierarchy, we do
not have a top-level `thing` module, so this import should fail. …Run Code Online (Sandbox Code Playgroud)