我有一个像这样的目录结构:
src/
--scripts/
----foo/a.py
----bar/b.py
--lib1
--lib2
--lib3
意图是使用script / foo /和scripts / bar /是可运行python脚本的目录,这些脚本使用lib1,lib2,lib3中的模块。脚本,lib1,lib2和lib3都是活动开发下的独立内部git存储库。没有静态接口或已发布的版本可供依赖。基本上,他们几乎都是由一个小团队同时写的。
我玩过lib [1-3]子模块,我真的讨厌工作流程。我想我想要的是能够从foo / a.py执行“import lib1”并让它使用lib1中的当前代码。一旦事情成熟,我们可能会对所有内容进行版本化并努
执行此操作的一种方法是在每个脚本中使用sys.path
进行清理,以明确查看“../../”或其他内容。我想知道是否有更优雅的东西。我可以获得像pip install -r requirements.txt
这样的工作吗?我不想做一个正式的pypi setup.py,我只是想获得一个指向lib [1-3]目录当前内容的指针。我喜欢requirements.txt方法的原因是,随着lib的成熟,我最终会在那里放置版本和git URL。
或者,有没有完全不同的方法呢?
答案 0 :(得分:2)
以通常的方式从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
使您的需求文件指向git仓库。如果你将它安装到virtualenv中,它将出现在virtualenv目录中的src/foo
,并且当从virtualenv运行Python时它将自动添加到sys.path
。
-e
选项也接受本地目录作为参数,因此如果您保证从requirements.txt
安装时当前工作目录始终是项目的根目录(以便相对路径正确解析)它应该可以正常工作,在那里写-e lib1
之类的东西,然后如果你愿意,你仍然可以将库作为git子模块引用。
如果您确定不来创建setup.py
,那么您的任务就是模拟运行python setup.py develop
时会发生什么。这个命令做了两件事(至少从Python 2.7开始):
site-packages
lib目录中创建一个egg link,指向您的目标源目录。easy-install.pth
添加一行,该行也位于site-packages
目录中,该目录也指向您的目标源目录。您可以选择通过运行setup.py editable
以外的方式执行上述两个操作,并对当前版本的Python获得相同的效果,但当然可编辑分发版的实现可能会在较新版本的Python中发生变化