包“在”模块内

时间:2011-11-08 08:36:12

标签: python module python-3.x package packaging

我有越来越多的脚本组成了我正在编写的程序,并决定是时候清理我的源代码树并正确打包它们了。我确定这是一个简单的问题,但我无法知道如何做到这一点。

如果我有一组适合的模块,但其中一个应该是顶级模块,其他模块应该以模块名称为前缀,但实际上是进入较低级别的软件包,我该怎么办呢。

例如说我希望能够import mystuff,并获得所有mystuff。但我也应该能够import mystuff.test.test1。我以为我会像这样创建一个源代码树,

myprogram/
    mystuff.py
    mystuff/
        __init__.py
        tests/
            __init__.py
            test1.py
            test2.py
            ...

但在这种情况下,似乎mystuff/始终优先于mystuff.py,因此import mystuff不执行任何操作(只要mystuff/的{​​{1}}是__init__.py空)。

获得理想行为的正确方法是什么?或者这是不可能的,我必须将mystuff.py移到mystuff/并且必须以mystuff.mystuff访问它(看起来像是不必要的重复)。

对不起,如果我错过了一些明显的东西。我认为这必须记录在某个地方,但我似乎无法找到某个地方。

更新。虽然我相信Ignacio的方法是正确的,但我真的不喜欢它!如果我在我的编辑器中打开了多个文件,并且它们都被称为__init__.py,那么事情就会变得混乱。所以,我决定保留我的结构,并将mystuff.pymystuff/__init__.py相关联。如果有人对我为什么不这样做有任何意见,我想听听他们的意见。

实际上最后,我正在连接另一种方式,因为我在创建tar.gz时找不到制作distutils dereference符号链接的方法,而我最终在我的链接中断了链接输出。这种方式具有相同的效果并让它保持愉快。

2 个答案:

答案 0 :(得分:4)

mystuff.py中的所有内容都应放入mystuff/__init__.py

答案 1 :(得分:4)

您不能同时拥有mystuff.pymystuff/个套餐。

您有两种选择:

  • mystuff.py中的代码放入mystuff/__init__.py
  • mystuff.py重命名为mystuff/_stuff.py,然后将其导入mystuff/__init__.py

第二个选项看起来像这样:

myprogram/
    mystuff.py -------
    mystuff/           \
        __init__.py    /
        _stuff.py <---
        tests/
            __init__.py
            test1.py
            test2.py
            ...

mystuff/__init__.py看起来像:

from mystuff._stuff import *