Python / Git / 模块结构最佳实践

3
我们有很多小型项目,它们共享一个名为“工具项目”的实用程序。
例如: 工具项目"数学"包含函数"add" 项目"A"和项目"B"都需要"math.add" 项目"A"与项目"B"没有任何关联。
因此,将这三个Git存储库(project_A、project_B和math)作为本地克隆,是否是一个好主意呢?
/SOMWHERE/workspace/project_A
/SOMWHERE/workspace/math

并且在/SOMWHERE/workspace/project_A/__init__.py中有类似以下的内容

import sys
sys.path.append('../math')
import math

math.add()

我已经阅读了结构化项目,但它并不涉及SCM和共享模块。

总之,我的问题是:

sys.path.append('../math')    
import math

这是一种好的实践方法,还是有更“pythonic”的方法吗?


使用Distutils或类似工具在本地安装"math",以便A和B可以使用它。(由于"math"是用于不相关项目的常用基础设施,因此它很可能相对稳定。) - Sven Marnach
你知道 git 子模块吗? - iveqy
@iveqy:是的,我知道这些,并且也许这是未来的发展方向。但在阅读了像共享代码以及为什么Git子模块是个坏主意这样的文章之后,我决定不使用它们。 - user3056904
@SvenMarnach:谢谢,我不知道distutils,所以我不得不去了解一下。也许我在问题中没有表达清楚:数学将会被相当频繁地更改(即由在A和B上工作的人进行提交),因此分发和安装似乎并不是非常实用的。 - user3056904
子模块需要一些 Git 知识,但是那篇文章只是在散布恐惧。其中第 1 和第 3 条是错误的,如果你理解 Git 的话,第 2 条并不奇怪。 - iveqy
2个回答

2
子模块是共享模块的一种次优方法,就像您在评论中所说的那样。更好的方法是使用您选择的语言提供的工具,例如Python。
首先,创建虚拟环境以隔离每个项目的Python环境。使用pip安装软件包并将依赖项存储在requirements.txt文件中。
然后,您可以使用distutils为每个工具库创建一个特定的软件包,并在Pypi上共享它
如果您不想将软件包发布到公共网络上,也可以托管自己的Pypi服务器
使用此设置,您将能够使用不同版本的库并在不破坏与旧代码库的兼容性的情况下对其进行修改。您还将避免使用Git难以使用的子模块。

1
但是你说过你不想一直构建发布版本,因为它在快速变化。唉... - andrew cooke

1
所有你描述的内容(3个项目)听起来都很好,除了你不应该随意更改sys.path。相反,应该设置PYTHONPATH环境变量。
此外,如果你不知道distutils,我猜你可能是新手Python开发者,并且可能不知道virtualenv。你也应该使用它(它允许你对一个“干净”的Python版本进行开发,该版本没有任何包,或者仅有你为该环境安装的包)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接