我可以使用requirements.txt文件来处理本地python目录吗?

时间:2013-03-27 22:15:11

标签: python python-2.7 pip

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

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。

或者,有没有完全不同的方法呢?

1 个答案:

答案 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开始):

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

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