我正在编写一些我想在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'显然是一个保留名称,不会在最终项目中使用。
我很感激有关我如何构建项目的反馈以及它是否被认为是标准的,或者是否应该以某种方式进行修改。
答案 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的包,此外还有package2
和package2.subpack1
)。它(目前)不允许的主要内容是使用package2.subpack2
编辑单个包(而不是其他包可编辑)。鉴于我的发展方式,这不是限制。
上面包含了命名空间包,其中许多其他方法都存在问题(请记住Python的最后一行:命名空间是一个很棒的主意 - 让我们做更多的)
上述示例可以在我的包ruamel.yaml
(例如ruamel.yaml.cmd
)中找到,或者通常通过搜索PyPI查找pip install -e
可能很明显,标准免责声明:我是这些软件包的作者
当我使用实用程序开始打包时,它也运行测试并进行其他健全性检查,通用ruamel.
也可以从设置中删除并由该实用程序插入。但由于子包检测是基于setup.py
可用性,因此需要对通用setup.py
进行一些修改。