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

我可以使用requirements.txt文件来处理本地python目录吗?,python,python-2.7,pip,Python,Python 2.7,Pip,我有这样一个目录结构: src/ --scripts/ ----foo/a.py ----bar/b.py --lib1 --lib2 --lib3 如果想让scripts/foo/和scripts/bar/be目录包含可运行的python脚本,这些脚本使用lib1、lib2、lib3中的模块。脚本、lib1、lib2和lib3都是处于活动开发中的独立内部git存储库。没有可依赖的静态接口或发布版本。基本上,它们几乎是由一个小团队同时编写的 我玩过制作lib[1-3]子模块,我真的很讨厌这个工

我有这样一个目录结构:

src/
--scripts/
----foo/a.py
----bar/b.py
--lib1
--lib2
--lib3
如果想让scripts/foo/和scripts/bar/be目录包含可运行的python脚本,这些脚本使用lib1、lib2、lib3中的模块。脚本、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方法的原因是,随着libs的成熟,我最终会将version和git URL放在其中


或者,有一种完全不同的方法可以做到这一点吗?

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

#!/usr/bin/env python

from distutils.core import setup

setup(
    name="foo",
)
如果您将类似的内容放入每个lib存储库中,那么您可以使用
-e使您的需求文件指向git repogit://git.example.com/foo.git#egg=foo
。如果将其安装到virtualenv中,则它将出现在virtualenv目录中的
src/foo
,并且在从该virtualenv运行Python时,它将自动添加到
sys.path

-e
选项也接受本地目录作为参数,因此,如果您保证当前工作目录在从
requirements.txt
安装时始终是项目的根目录(以便正确解析相对路径),那么在其中写入
-e lib1
之类的内容就可以了,然后,如果需要,仍然可以将这些库作为git子模块引用

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

  • 它在virtualenv(如果没有virtualenv,则在系统范围内)的
    站点包
    lib目录中创建指向目标源目录的
  • 它向
    easy install.pth
    添加了一行,该行也位于
    站点软件包
    目录中,该目录也指向您的目标源目录

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

如果我不使用virtualenv,它将安装在哪里?如果您是从git repo安装的,根据我的经验,
pip
将在当前工作目录中创建一个
src
目录。我不确定这是故意的还是由于未设置
VIRTUAL_ENV
环境变量而导致的错误。如果您从本地目录安装,则它将尝试将egg链接和
pth
文件写入系统范围的
站点软件包
dir,并使用您指定的本地目录的绝对路径。