Python Package Index(PyPi)提交的模板

时间:2017-02-20 06:49:40

标签: python templates package pypi submission

我正在编写一些我想在PyPi上发布供其他人使用的软件包。

我之前没有发布过PyPi所以我一直在嘲笑提交模板:https://github.com/chris-brown-nz/pypi-package-template

这是项目模板的树:

|   MANIFEST.in
|   README.rst
|   setup.cfg
|   setup.py
|       
\---package
        module_one.py
        module_three.py
        module_two.py
        __init__.py

在与包装的互动方面,这是我通常会做的 - 这是最好的方式吗?

运行方法:

from package import module_one
module_one.ClassOne().method_a()

从方法中获取值:

from package import module_two
print(module_two.ClassFive().method_e())

然后设置然后使用实例的属性:

from package import module_three
cls = module_three.ClassSeven("Hello World")
print(cls.value)

'package'显然是一个保留名称,不会在最终项目中使用。

我很感激有关我如何构建项目的反馈以及它是否被认为是标准的,或者是否应该以某种方式进行修改。

1 个答案:

答案 0 :(得分:2)

对此有不同的方法,无论是一个还是另一个更好取决于您想要开发的方式,包的使用(例如,如果您使用pip install -e packag_name安装它)等等。

树中缺少的是setup.py所在目录的名称,通常是包名称:

└── package
    ├── package
    │   ├── __init__.py
    │   ├── module_one.py
    │   ├── module_three.py
    │   └── module_two.py
    ├── MANIFEST.in
    ├── README.rst
    ├── setup.cfg
    └── setup.py

正如你所看到的那样,你正在将这个包装加倍。 name,这意味着必须为每个包调整setup.py,或者动态确定module.py文件所在目录的名称。如果你选择这条路线,我建议你将module.py个文件放在一个通用命名的目录中,然后再添加一个' src'或者' lib'。

我不喜欢上述"标准"设置有多种原因:

  • 它没有很好地映射到python程序"如何成长"在它们分成包之前。在分裂这样一个' src之前目录意味着使用:

    from package.src.module_one import MyModuleOneClass
    

    相反,您可以将module.py文件直接放在package

  • 使用setup.py来控制安装,README.rst用于文档和__init__.py以满足Python的导入是一回事,但除了你的{之外的所有其他内容{1}}包含实际功能的文件是垃圾。在程序包创建过程中某些时候可能需要的垃圾,但不是包功能所必需的。

还有其他注意事项,例如能够从module.py以及程序访问软件包的版本号,而前者不必自行导入软件包(这可能会导致安装并发症) ),还没有另外需要导入的setup.py文件。

特别是我总是发现在site-packages下使用目录结构的过渡看起来像:

version.py

这可以直观地用于导入和导航到源文件,如:

└── organisation
    ├── package1
    └── package2
        ├── subpack1
        └── subpack2

不自然。重新排列和打破工作结构,以便能够打包东西似乎是错误的。

对于我发布的包,我采用了另一种方式: - 在包装之前我保留了你可以使用的天然树木结构",' src'或者' lib'目录。 - 我有一个通用├── organisation_package1 │   └── src ├── organisation_package2_subpack1 │   └── src └── organisation_package2_subpack2 └── src ,它读取和解析(它>导入)元数据(例如版本号,包名,许可信息,是否安装实用程序(及其名称) )),来自setup.py文件中的字典。无论如何你需要的文件。 - __init__.py足够智能,可以将包含其他包的子目录与作为父包的子目录的子目录区分开来。 - setup.py只生成包生成期间所需的文件(如setup.py),并在不再需要时删除它们。

以上允许您拥有嵌套的命名空间包(即setup.cfg可以是您上传到PyPI的包,此外还有package2package2.subpack1)。它(目前)不允许的主要内容是使用package2.subpack2编辑单个包(而不是其他包可编辑)。鉴于我的发展方式,这不是限制。

上面包含了命名空间包,其中许多其他方法都存在问题(请记住Python的最后一行:命名空间是一个很棒的主意 - 让我们做更多的

上述示例可以在我的包ruamel.yaml(例如ruamel.yaml.cmd)中找到,或者通常通过搜索PyPI查找pip install -e

可能很明显,标准免责声明:我是这些软件包的作者

当我使用实用程序开始打包时,它也运行测试并进行其他健全性检查,通用ruamel.也可以从设置中删除并由该实用程序插入。但由于子包检测是基于setup.py可用性,因此需要对通用setup.py进行一些修改。