Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python包索引(PyPi)提交模板_Python_Templates_Package_Pypi_Submission - Fatal编程技术网

Python包索引(PyPi)提交模板

Python包索引(PyPi)提交模板,python,templates,package,pypi,submission,Python,Templates,Package,Pypi,Submission,我正在编写几个包,我想在PyPi上发布,供其他人使用 我以前没有发布过PyPi,所以我一直在模拟提交模板: 以下是项目模板的树: | MANIFEST.in | README.rst | setup.cfg | setup.py | \---package module_one.py module_three.py module_two.py __init__.py 就与软件包的交互而言,这是我通常会

我正在编写几个包,我想在PyPi上发布,供其他人使用

我以前没有发布过PyPi,所以我一直在模拟提交模板:

以下是项目模板的树:

|   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_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”显然是一个保留名称,不会在最终项目中使用


对于我如何组织我的项目,以及它是否被视为标准,或者是否应该以某种方式进行修改,我非常感谢您的反馈。

对此有不同的方法,其中一种更好,取决于您希望如何开发、使用包(例如,如果您曾经使用
pip安装-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
正如您所看到的,您正在将“package”名称加倍,这意味着您的
setup.py
必须针对每个包进行调整,或者动态确定
module.py
文件所在目录的名称。如果您选择此方法,我建议您将
module.py
文件放在一个通用名称的目录中或“src”或“lib”

出于多种原因,我不喜欢上述“标准”设置:

  • 在将python程序拆分为包之前,它无法很好地映射到python程序的“增长”方式。在拆分之前,拥有这样一个“src”目录意味着使用:

    from package.src.module_one import MyModuleOneClass
    
    相反,您将把
    module.py
    文件直接放在
    package

  • 有一个
    setup.py
    来控制安装,有一个
    README.rst
    来编写文档,有一个
    来满足Python的导入是一回事,但是除了包含实际功能的
    module.py
    文件之外,所有其他东西都是垃圾。在pac过程中的某个时候可能需要垃圾kage创建过程,但不是包功能所必需的
还有其他注意事项,例如能够从
setup.py
以及程序中访问软件包的版本号,而无需前者导入软件包本身(这可能会导致安装复杂),也无需导入另一个额外的
version.py
文件

特别是,我总是发现在站点包下使用目录结构的转换如下:

└── organisation
    ├── package1
    └── package2
        ├── subpack1
        └── subpack2
这可以直观地用于导入和导航源文件,例如:

├── organisation_package1
│   └── src
├── organisation_package2_subpack1
│   └── src
└── organisation_package2_subpack2
    └── src
不自然。重新安排和打破工作结构以便能够打包东西似乎是错误的

对于我发布的包集,我采用了另一种方式: -我保留了自然的树结构,您可以使用“打包前”、“src”或“lib”目录。 -我有一个通用的
setup.py
,它从
\uuu init\uuuuuuuuuy.py
文件中的字典中读取和解析元数据(例如版本号、包名、许可证信息、是否安装实用程序(及其名称)),这是您仍然需要的文件。 -py
足够智能,可以将包含其他包的子目录与作为父包一部分的子目录区分开来。 -setup.py会动态生成仅在包生成过程中需要的文件(如
setup.cfg
),并在不再需要时删除这些文件

上面允许您使用嵌套的名称空间包(即,
package2
可以是您上传到PyPI的包,另外还有
package2.subpack1
package2.subpack2
)。它(当前)不允许的主要事情是使用
pip安装-e
编辑单个包(而不允许编辑其他包).考虑到我的发展方式,这不是一个限制

上面介绍了名称空间包,其中许多其他方法都存在这些问题(请记住Python的Zen的最后一行:名称空间是一个非常好的想法——让我们做更多的工作)

例如,可以在我的软件包(和例如)中找到上述示例,或者通过搜索PyPI查找
ruamel.


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

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

谢谢Anthon,这让我想了很多,但我已经看过了你的bitbucket回购协议,可以看到它是如何工作的。但有一个问题,在我的情况下,只有一个软件包需要安装,没有子软件包。我对你的模型的理解是,我会有一个目录(“软件包”),其中包含所有内容(除了_doc和_test等?)没有其他子文件夹)因为您指出您有一个模板,我认为您包含了多个包。对于将要转到PyPI的一个包,您实际上不需要模板。即使没有子包(或多个包),您仍然可以使用my
setup.py
,但没有多大回报。如果您有更多问题,请在此处提问,或向我发送电子邮件(您可以通过个人资料找到)。谢谢Anthon,很抱歉,我一开始没有说清楚。我确实有三个正在开发的软件包,但它们基本上是不相关的,所以我将它们分开。根据我问题中的示例,你认为我打算让用户如何与软件包进行交互,这是正确的吗?