2017-02-20 76 views
2

我正在编写几个我想在PyPi上发布的包供其他人使用。Python包提交模板(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_two 
print(module_two.ClassFive().method_e()) 

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

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

“包

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

要从方法得到的值'显然是一个保留名称,不会在最终项目中使用。

对于我如何构建项目以及它是否被视为标准,或者是否应以某种方式进行修改,我将不胜感激。

回答

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 

,你可以看到你加倍的“一揽子”的名字,这意味着你的setup.py必须适应每个包,或动态确定t的名称他目录的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的导入是一回事,但除了包含实际功能的module.py文件之外,其他所有内容都是垃圾。在程序包创建过程中某些时候可能需要垃圾,但对于程序包功能不是必需的。

还有其他的考虑,如能够从程序访问包从setup.py的版本号,以及,没有前者不必导入包本身(这可能导致安装的并发症) ,也没有需要导入的另一个额外的version.py文件。

特别是我总是发现从下看起来像站点包使用的目录结构转型:

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

,并可能直观地同时用于进口和导航源文件,喜欢的东西:

├── organisation_package1 
│   └── src 
├── organisation_package2_subpack1 
│   └── src 
└── organisation_package2_subpack2 
    └── src 

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

对于我的发布软件包,我采用了另一种方式: - 我保留了可以在“打包”,“src”或“lib”目录之前使用的自然树结构。 - 我有一个通用的setup.py,它从字典中的字典中读取和解析元数据(例如版本号,软件包名称,许可证信息,是否安装实用程序(及其名称))(它的作用是而不是__init__.py文件。无论如何你都需要一个文件。 - setup.py足够聪明,可以区分包含其他包的子目录和作为父包的子目录的子目录。 - setup.py生成仅生成软件包时需要的文件(如setup.cfg),并在不再需要时删除它们。

上面允许您嵌套命名空间包(即package2可以是您上传到PyPI的包,除了package2.subpack1package2.subpack2之外)。它(当前)不允许的主要事情是使用pip install -e来编辑一个包(而不能让其他人编辑)。鉴于我发展的方式,这不是一个限制。

上面包含了命名空间的包,那里有很多其他的方法有这些问题(还记得Python中的禅宗的最后一行:命名空间是一个鸣喇叭伟大构想 - 让我们做更多的的)的

例子上述例如可以在我的包ruamel.yaml(和EG ruamel.yaml.cmd),或一般通过搜索的PyPI中找到ruamel.


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

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

+0

谢谢安东恩,这是很多让我的头,但我已经看了你的bitbucket回购,可以看看它是如何工作。一个问题,虽然,我的情况将只有一个包安装,并没有子包。我对你的模型的理解是,我有一个目录('包'),下面的所有东西(除_doc和_test之外没有子文件夹?) –

+0

由于你表示你有一个模板,我以为你牵连多个包。对于只有一个将进入PyPI的软件包,您并不需要模板。即使没有子包(或多个包),你仍然可以使用我的'setup.py',但它并没有得到多少回报。如果你有更多的问题在这里问,或给我发了一封电子邮件(你可以通过个人资料找到)。 – Anthon

+0

谢谢安森,对不起,我没有明确表明这一点。我确实有三个我正在开发的软件包,但它们基本上没有关系,所以我会将它们分开。按照我的问题中的例子,您认为我打算如何让用户与包进行交互,是否正确? –