【问题标题】:Including Git submodules on pythonpath when using virtualenv使用 virtualenv 时在 pythonpath 上包含 Git 子模块
【发布时间】:2011-12-13 16:32:46
【问题描述】:

我正在使用 Git 对 Django 项目进行版本控制。

尽可能将所有不属于项目本身但项目依赖的源代码作为 Git 子模块引入。它们位于lib 目录中,并且必须包含在 python 路径中。目录/文件布局如下:

.git
docs
lib
my_project
    apps
    static
    templates
    __init__.py
    urls.py
    manage.py
    settings.py
    .gitmodules
README

您会说,在 python 路径中包含库的最佳做法是什么?

我正在使用 virtualenv,所以我可以轻松地将库符号链接到 virtualenv 的站点包目录。但是,这会将 virtualenv 绑定到这个特定的项目。我的理解是 virtualenv 不应该依赖于我的文件。相反,我的文件应该依赖于 virtualenv。

我正在考虑对这个项目的不同本地副本使用相同的 virtualenv,但如果我这样做,我将失去这种能力。有更好的方法来解决这个问题吗?


更新:

结果证明,最好的解决方案是让 pip 管理所有依赖项。

但是,这意味着无法使用 git 子模块,如 pip can't yet handle relative paths properly。因此,外部依赖项必须存在于 virtualenv 上(通常是:my_env/src/a_python_module)。

我仍然更喜欢使用子模块,让一些依赖项存在于我的项目树上。这对我来说更有意义,因为我已经需要分叉这些存储库来更改其中的一些内容,并且将来可能需要进行更多更改。

【问题讨论】:

    标签: python django git virtualenv pythonpath


    【解决方案1】:

    使用

    将所有已安装的包转储到需求文件中(requirements.txt 看起来是标准命名)
    pip freeze > requirements.txt
    

    每次你需要一个新的 virtualenv 你只需要这样做:

    virtualenv <name> --no-site-packages
    pip install -r requirements.txt
    

    如果您想更新到较新的软件包, install -r requirements.txt 也很有效

    只要让 requirements.txt 与你的包同步(每次发生变化时运行 pip freeze),你就完成了,不管你有多少 virtualenv。

    注意:如果您需要对软件包进行一些开发,您可以使用 -e(可编辑)参数安装它,这样您就可以编辑软件包,而不必每次都卸载/安装测试新东西:)

    【讨论】:

    • 这要求我的所有依赖项都可以通过 pip 找到,对吗?不幸的是,大多数都不是。
    • @FilipeCorreia 使用 pip 您可以从 git、svn、mercurial 安装包,例如pip install git+/#egg=Package
    • 有趣。好的,但这是否意味着我将不得不放弃将它们作为 git 子模块?
    • @FilipeCorreia 你可以同时使用,我的建议是不要使用 git 子模块作为 python 包管理器,因为有工具!
    • 显然是 pip requires a setup.py to exist。我正在使用的项目之一没有 setup.py,但我会尝试让作者添加一个,但没有更好的选择。
    猜你喜欢
    • 1970-01-01
    • 2012-05-31
    • 2011-06-03
    • 2011-01-20
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多