温馨提示:本文翻译自stackoverflow.com,查看原文请点击:deployment - Python packaging of weakly dependent projects

deployment - 弱依赖项目的Python打包

发布于 2020-04-09 10:47:31

我想找出一种打包和部署我创建的python软件包的好方法。最终,我想使用一些软件包存储库进行部署或创建某种安装脚本。

我的项目的结构如下:我有两个子项目A两个子项目B都使用另一个自创建包中的工具C所提供的工具C仅供内部使用,而对普通读者没有太大的兴趣。然而,AB应部署。我想用户可以安装AB相互独立的,但我并不需要/想部署C为独立的。

最好的情况是,我希望用户能够按照以下方式安装软件包

pip install my_project.A

要么

pip install my_project.B

此外,在中A,我想导入C如下:

import my_project.C

我将不得不打包AB以及C独立和工作,install_requiressetuptools.setup如果所有项目都属于一个大型“元项目”,那么有什么办法可以在保持总体独立性的同时将它们弱地捆绑在一起?(在我的示例中,C包含“ tools”。我不想部署具有此类通用名称的软件包。然后将其部署为my_project_tools吗?)

有没有办法让从该元软件包安装的所有软件包都安装在同一文件夹层次结构中,同时允许安装该元软件包的单独组件?有一个相关的答案在这里,但我的问题有不同的是公共依赖C

我是包装技术的新手,所以我很欣赏没有太多背景知识的答案。

附加信息:我正在使用Python 3.7,并且该程序与较低版本不兼容。不过,它应该独立运行平台。一些模块需要编译和Cython。

查看更多

提问者
Samufi
被浏览
77
sinoroc 2019-12-30 00:59

像下面的内容可能是一个解决方案,其中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项目:

  • NmspcCore提供nmspc._core(开头的下划线表示私有元素),不应直接安装
  • NmspcPing提供nmspc.ping并依赖于NmspcCore
  • NmspcPong提供nmspc.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这样的项目将是空的(没有实际的代码),但是将NmspcPingNmspcPong作为直接依赖项,因此可以一次安装整个项目。