2

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

但这并不完全奏效。任何帮助将不胜感激!

4

1 回答 1

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 练习 46有一个简单而清晰的项目框架,您应该使用它。

最重要的部分是setup.py文件。示例页面并不太长,Zed 为制作一本非常棒的书付出了很多努力,所以我不打算在此处重新发布它(尽管整本书都是免费的)。您还可以阅读更长的说明/文档来为 distutils 编写 setup.py 文件,但是 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然后像文件在当前目录中一样访问's 函数。

开发包的有用说明

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

python setup.py develop

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

于 2012-06-09T05:31:09.420 回答