我有越来越多的脚本组成了我正在编写的程序,并决定是时候清理我的源代码树并正确打包它们了。我确定这是一个简单的问题,但我无法知道如何做到这一点。
如果我有一组适合的模块,但其中一个应该是顶级模块,其他模块应该以模块名称为前缀,但实际上是进入较低级别的软件包,我该怎么办呢。
例如说我希望能够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.py
与mystuff/__init__.py
相关联。如果有人对我为什么不这样做有任何意见,我想听听他们的意见。
实际上最后,我正在连接另一种方式,因为我在创建tar.gz
时找不到制作distutils dereference符号链接的方法,而我最终在我的链接中断了链接输出。这种方式具有相同的效果并让它保持愉快。
答案 0 :(得分:4)
mystuff.py
中的所有内容都应放入mystuff/__init__.py
。
答案 1 :(得分:4)
您不能同时拥有mystuff.py
和mystuff/
个套餐。
您有两种选择:
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 *