我目前有一个名为" peewee"它由一个python文件peewee.py组成。还有一个模块" tests.py"包含单元测试。这很棒,想要使用该库的人只需抓取一个文件并随之运行。
我最近想添加一些额外内容,但我不知道如何做到这一点才能使命名空间正确。如果你查看我的项目的根目录,它就像:
peewee.py
tests.py
我想添加以下内容:
extras/__init__.py
extras/foo.py
extras/bar.py
这是棘手的部分。我希望这样,使用单个文件的人仍然可以这样做,但如果你想要额外的东西,你也可以拥有它们。我希望将额外内容命名为:
from peewee.extras import foo
from peewee.extras.bar import Baz
我的setup.py看起来有点像这样:
setup(
name='peewee',
packages=['extras'],
py_modules=['peewee'],
# ... etc ...
)
但这并不是很有效。任何帮助将不胜感激!
答案 0 :(得分:2)
正如@ThomasK所说,最简单的方法是使用包。如果您将软件包命名为peewee
,则可以编辑顶级__init__.py
文件,以允许用户继续使用您之前使用过的软件包。
首先,包和子文件夹的目录结构:
peewee/
__init__.py
peewee.py
extras/
__init__.py
foo.py
bar.py
__init__.py
文件接下来,您需要在顶级__init__.py
添加几行。
你可以采用快速而简单的方法,只需要包括:
from peewee.peewee import *
会将peewee.py
中的所有内容放入程序包的顶级命名空间中。或者,您可以采用更传统的替代方法,并明确导入那些应该位于顶层的方法。
from peewee.peewee import funtion1, class1,...
并且,为了向后兼容,您可以明确地将模块的__all__
属性设置为仅包含peewee
__all__ = ['peewee']
如果他们确实需要,可以让人们继续使用from peewee import *
。
setup.py
文件最后,您还必须设置一些安装脚本等。 Zed Shaw的Learn Python The Hard Way exercise 46有一个简单明了的项目骨架,你应该使用它。
最重要的部分是setup.py
文件。示例页面不是太长,Zed为制作一本非常棒的书付出了很多努力,所以我不打算在这里重新发布它(尽管整本书可用于 free )。您还可以阅读writing a setup.py file for distutils的更长说明/文档,但LPTHW会为您提供一些可以快速轻松地完成您想要的任务。
请注意,您的最终目录结构实际上会更大一些(peewee-pkg
的名称无关紧要,bin
是可选的 - 子文件夹的名称很重要)
peewee-pkg/
setup.py
bin
peewee/
__init__.py
peewee.py
extras/
__init__.py
foo.py
bar.py
之后,您可以根据需要将包发布到PyPi,或者直接将其分发给用户。他们需要做的只是运行:
python setup.py install
一切都将为他们所用。
最后,如果您按照前面所述在peewee/__init__.py
文件中执行特定导入,则您的用户仍可以执行此操作:
from peewee import function1, class1, ...
但是现在他们也可以使用import peewee.extras
来获取额外功能(或import peewee.extras.foo as foo
或from pewee.extras.foo import extra_awesome
)等等。正如您在问题中提到的那样,他们也会能做到:
from pewee.extras import foo
然后访问foo
的函数,就像文件在当前目录中一样。
在您的计算机上,您应该运行:
python setup.py develop
会将包安装到您的路径,就像使用python setup.py install
一样;但是,develop
告诉python每次使用模块时都要重新检查文件,这样每次进行更改时,它们都可以立即供系统进行测试。