我正在尝试找到一种打包和部署我创建的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
包含“工具”。我不想部署具有此类通用名称的软件包。然后我必须将其部署为my_project_tools
吗?)
是否有办法将所有从该元软件包安装的软件包安装在同一文件夹层次结构中,同时允许安装该元软件包的单独组件?
有一个相关的答案here,但是我的问题有所不同,因为存在共同的依赖性C
。
我是包装行业的新手,所以我很欣赏没有太多背景知识的答案。
其他信息::我使用的是Python 3.7,该程序与较低版本不兼容。不过,它应该独立运行平台。有些模块需要编译和Cython。
答案 0 :(得分:2)
如下所示的解决方案可以将 Nmspc 视为 Ping 和 Pong的元项目 。尚未经过实际测试,因此需要进行一些调整。
目录树可能看起来像这样:
.
├── 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
,并取决于 NmspcCore nmspc.pong
,并取决于 NmspcCore 它们都使用命名空间包。可以根据Python Packaging User Guide on "Packaging namespace packages, Native namespace packages"中的说明进行设计。还有另一个示例here。
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)
也可以考虑使用 umbrella 项目 Nmspc 。这样的项目将是空的(没有实际代码),但是将 NmspcPing 和 NmspcPong 作为直接依赖项,以便可以一次安装整个项目。 / p>