打包单个python文件以及“extras”包

时间:2012-06-08 23:15:08

标签: python namespaces packaging

我目前有一个名为" 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 ...
)

但这并不是很有效。任何帮助将不胜感激!

1 个答案:

答案 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 foofrom pewee.extras.foo import extra_awesome)等等。正如您在问题中提到的那样,他们也会能做到:

from pewee.extras import foo

然后访问foo的函数,就像文件在当前目录中一样。

开发包

的有用说明

在您的计算机上,您应该运行:

python setup.py develop

会将包安装到您的路径,就像使用python setup.py install一样;但是,develop告诉python每次使用模块时都要重新检查文件,这样每次进行更改时,它们都可以立即供系统进行测试。