我想找出一种打包和部署我创建的python软件包的好方法。最终,我想使用一些软件包存储库进行部署或创建某种安装脚本。
我的项目的结构如下:我有两个子项目A
,两个子项目B
都使用另一个自创建包中的工具C
。所提供的工具C
仅供内部使用,而对普通读者没有太大的兴趣。然而,A
和B
应部署。我想用户可以安装A
和B
相互独立的,但我并不需要/想部署C
为独立的。
最好的情况是,我希望用户能够按照以下方式安装软件包
pip install my_project.A
要么
pip install my_project.B
此外,在中A
,我想导入C
如下:
import my_project.C
我将不得不打包A
,B
以及C
独立和工作,install_requires
在setuptools.setup
?如果所有项目都属于一个大型“元项目”,那么有什么办法可以在保持总体独立性的同时将它们弱地捆绑在一起?(在我的示例中,C
包含“ tools”。我不想部署具有此类通用名称的软件包。然后将其部署为my_project_tools
吗?)
有没有办法让从该元软件包安装的所有软件包都安装在同一文件夹层次结构中,同时允许安装该元软件包的单独组件?有一个相关的答案在这里,但我的问题有不同的是公共依赖C
。
我是包装技术的新手,所以我很欣赏没有太多背景知识的答案。
附加信息:我正在使用Python 3.7,并且该程序与较低版本不兼容。不过,它应该独立运行平台。一些模块需要编译和Cython。
像下面的内容可能是一个解决方案,其中Nmspc可考虑元项目的平安和乒乓球。尚未经过实际测试,因此需要进行一些调整。
目录树可能如下所示:
.
├── NmspcCore
│ ├── nmspc
│ │ └── _core
│ │ ├── __init__.py
│ │ └── common.py
│ └── setup.py
├── NmspcPing
│ ├── nmspc
│ │ └── ping
│ │ ├── __init__.py
│ │ └── foo.py
│ └── setup.py
└── NmspcPong
├── nmspc
│ └── pong
│ ├── __init__.py
│ └── bar.py
└── setup.py
3个Python项目:
nmspc._core
(开头的下划线表示私有元素),不应直接安装nmspc.ping
并依赖于NmspcCorenmspc.pong
并依赖于NmspcCore它们都使用命名空间包。可以根据《Python包装用户指南》中“包装名称空间包,本机名称空间包”的说明进行设计。还有一个好例子在这里。
NmspcCore/setup.py
:
#!/usr/bin/env python3
import setuptools
setuptools.setup(
name='NmspcCore',
version='1.2.3',
packages=['nmspc._core',],
)
NmspcCore/nmspc/_core/common.py
MARCO = 'polo'
NmspcPing/setup.py
(和类似的NmspcPong/setup.py
):
#!/usr/bin/env python3
import setuptools
setuptools.setup(
name='NmspcPing',
version='1.2.3',
packages=['nmspc.ping',],
install_requires=['NmspcCore',],
)
NmspcPing/nmspc/ping/foo.py
import nmspc._core
print(nmspc._core.common.MARCO)
也可以考虑一个伞式项目Nmspc。这样的项目将是空的(没有实际的代码),但是将NmspcPing和NmspcPong作为直接依赖项,因此可以一次安装整个项目。
感谢您的明确答复!不过,我不确定我是否完全理解下划线问题。Wat
_core
私有化的好处是什么?您能再详细一点吗?1.主要的下划线只是Python约定。这基本上意味着“仅供内部使用”。当看到下划线时,他们应该知道不要弄混下划线,例如,不要导入它。但是请记住,这只是一个约定,下划线没有实际作用,并且元素仍然可以导入。2.措辞可能会引起误解:可以并且将安装该项目,但是独立安装它没有意义,因为它是供内部使用的库。
您可能还想考虑一个伞项目Nmspc,该项目将为空(无实际代码),但是它将NmspcPing和NmspcPong作为直接依赖项,以便可以一次安装整个项目。