【问题标题】:Accessing names defined in a package's `__init__.py` when running setuptools tests运行 setuptools 测试时访问包的 `__init__.py` 中定义的名称
【发布时间】:2010-09-26 00:16:53
【问题描述】:

我已经将模块代码直接放在包 __init__.py 中,即使对于最终成为唯一文件的简单包也是如此。

所以我有一堆看起来像这样的包(尽管它们并不全称为pants:)

+ pants/
\-- __init__.py
\-- setup.py
\-- README.txt
\--+ test/
   \-- __init__.py

我开始这样做是因为它允许我将代码放在一个单独的(并且至关重要的是,单独的版本化)目录中,并让它以与包位于单个 module.py 中时相同的方式工作.我将这些保存在我的 dev python lib 目录中,我在处理此类事情时已将其添加到 $PYTHONPATH 中。每个包都是一个单独的 git repo。

编辑...

与典型的 Python 包布局相比,如 Radomiranswer 所示,这种设置使我不必将每个包的目录添加到我的 PYTHONPATH 中。

.../编辑

效果很好,但我遇到了这个(有点晦涩的)问题:

从包目录中运行测试时,包本身,即__init__.py 中的代码,不能保证在sys.path 上。这在我的典型环境下不是问题,但是如果有人下载pants-4.6.tgz并将源分发的tarball,cds 解压到目录中,然后运行python setup.py test,则包pants本身不会正常在他们的sys.path.

我觉得这很奇怪,因为我希望 setuptools 从被测包的父目录运行测试。但是,无论出于何种原因,它都不会那样做,我猜是因为通常你不会这样包装东西。

相对导入不起作用,因为test 是一个顶级包,被发现是sys.path 的当前目录组件的子目录。

我想避免将代码移动到单独的文件中并将其公共名称导入__init__.py。主要是因为对于一个简单的模块来说,这似乎是毫无意义的混乱。

我可以从setup.py 中将父目录显式添加到sys.path,但不希望这样做。一方面,至少在理论上,这可能会失败,例如如果有人决定从他们的文件系统(可能是 Windows 驱动器)的根目录运行测试。但大多数情况下,它只是感觉被操纵了。

有没有更好的办法?

将代码放在__init__.py 中是否被认为是特别糟糕的形式?

【问题讨论】:

    标签: python testing module packages setuptools


    【解决方案1】:

    我认为打包python程序的标准方式会更像这样:

    \-- setup.py
    \-- README.txt
    \--+ pants/
       \-- __init__.py
       \-- __main__.py
       ...
    \--+ tests/
       \-- __init__.py
       ...
    \--+ some_dependency_you_need/
       ...
    

    那么你就避免了这个问题。

    【讨论】:

    • 是的,但我还遇到了另一个问题:由于其父目录位于 PYTHONPATH 中,因此包的代码不再可用。我希望尽量减少或消除我正在积极使用的打包代码所涉及的基础架构/构建复杂性。
    • 它可以很好地使用,您只需执行“从裤子进口袜子”而不是“进口袜子”,但无论如何您都应该这样做以避免奇怪的名称冲突。我见过的大多数 python 项目都是这样做的。
    • 如果你遵循这个布局,那么你可以使用“setup.py develop”将正确的目录添加到sys.path,而不必手动进行。
    • 我想过制作一个名为underpants 的模块,但它看起来有点过头了。 ||||||||||||我最终做的是将代码放入pants.py 并使用py_modules 安装它。然后我只是从父目录符号链接到它。我摆脱了顶级__init__.py。 @pjeby:感谢setup.py develop 的提示;我真的不明白它的作用,但给人的印象是当我尝试它时它会非常不言自明。 @Radomir Dopieralski:使用我的 dev python 目录中的符号链接,这可以正常工作。谢谢。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    相关资源
    最近更新 更多