【问题标题】:Can I use a requirements.txt file to handle local python directories?我可以使用 requirements.txt 文件来处理本地 python 目录吗?
【发布时间】:2025-12-03 02:15:02
【问题描述】:

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

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 放在那里。

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

【问题讨论】:

    标签: python python-2.7 pip


    【解决方案1】:

    以通常的方式从 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 中发生变化。

    【讨论】:

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