1

我有一个这样的目录结构:

src/
--scripts/
----foo/a.py
----bar/b.py
--lib1
--lib2
--lib3

目的是让 scripts/foo/ 和 scripts/bar/ 成为使用 lib1、lib2、lib3 中的模块的可运行 python 脚本的目录。脚本、lib1、lib2 和 lib3 都是处于积极开发中的独立的内部 git 存储库。没有可依赖的静态接口或发布版本。基本上,它们几乎都是由一个小团队同时编写的。

我玩过制作 lib[1-3] 子模块,我真的很讨厌这个工作流程。我想我想要的是能够从 foo/a.py 执行“导入 lib1”并让它使用 lib1 中的当前代码。一旦事情成熟,我们可能会对所有内容进行版本化并努力生产适当的软件包。

做到这一点的一种方法是sys.path在每个脚本中明确地查看“../../”或其他内容。我想知道是否有更优雅的东西。我可以pip install -r requirements.txt为我做这项工作吗?我不想制作官方的pypi setup.py,我只想获取指向lib[1-3]目录当前内容的指针。我喜欢 requirements.txt 方法的原因是随着库的成熟,我最终会将版本和 git URL 放在那里。

或者,是否有完全不同的方法来做到这一点?

4

1 回答 1

3

以通常的方式从 git 存储库安装模块确实需要setup.py.,但它可以是最低限度的,而不是像 PyPI 模块那样更完整的模块。例如:

#!/usr/bin/env python

from distutils.core import setup

setup(
    name="foo",
)

如果您将类似的内容放入每个 lib 存储库中,那么您可以使用-e git://git.example.com/foo.git#egg=foo. 如果将它安装到 virtualenv 中,那么它将出现在src/foovirtualenv 目录中,并且在sys.path从该 virtualenv 运行 Python 时会自动添加到该目录中。

-e选项还接受本地目录作为参数,因此如果您保证在安装时当前工作目录将始终是项目的根目录requirements.txt(以便正确解析相对路径),它应该可以很好地编写类似的内容-e lib1在那里,然后您仍然可以根据需要将库作为 git 子模块引用。

如果你决定创建一个,setup.py那么你的任务就是模拟运行时会发生什么python setup.py develop。这个命令做了两件事(至少从 Python 2.7 开始):

  • 它会在您的 virtualenv(或系统范围,如果您没有 virtualenv)的lib 目录中创建一个指向目标源目录的egg 链接。site-packages
  • 它在目录中添加了一行easy-install.pth,该site-packages目录也指向您的目标源目录。

您可以选择通过运行以外的方式执行上述两个操作,setup.py editable并为当前版本的 Python 获得相同的效果,但当然,可编辑发行版的实现可能会在较新版本的 Python 中发生变化。

于 2013-03-28T05:52:08.160 回答