在使用virtualenv时如何将Git子模块加入pythonpath

3 投票
1 回答
2486 浏览
提问于 2025-04-17 08:18

我在一个Django项目中使用Git来管理版本。

为了尽量把项目所依赖的源代码都放在一起,我把这些代码作为Git子模块引入。这些子模块放在一个叫lib的目录里,并且需要被包含在Python的路径中。这个目录和文件的结构大致是这样的:

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

你觉得,怎么把这些库包含到Python路径中是最好的做法呢?

我在使用virtualenv,所以我可以很方便地把这些库的链接放到virtualenv的site-packages目录里。不过,这样的话,virtualenv就会和这个特定的项目绑定在一起。我理解的意思是,virtualenv不应该依赖我的文件,而是我的文件应该依赖virtualenv。

我本来想在不同的本地项目副本中使用同一个virtualenv,但如果这样做的话,我就失去了这个能力。有没有更好的方法来处理这个问题呢?


更新:

最终发现,最好的解决方案是让pip来管理所有的依赖。

不过,这意味着不能使用git子模块,因为pip 目前还不能正确处理相对路径。所以,外部依赖必须放在virtualenv里(通常是:my_env/src/a_python_module)。

我还是更希望使用子模块,这样一些依赖可以放在我的项目树上。这对我来说更有意义,因为我已经需要对那些库进行分叉来修改一些内容,未来可能还会需要再修改。

1 个回答

3

把你安装的所有软件包都记录在一个需求文件里,通常叫做 requirements.txt。

pip freeze > requirements.txt

每次你需要创建一个新的虚拟环境时,只需运行:

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

使用 install -r requirements.txt 这个命令也很方便,如果你想更新到新版本的软件包。

只要保持 requirements.txt 和你安装的软件包同步(每次有变化时运行 pip freeze),这样就没问题了,不管你有多少个虚拟环境。

注意:如果你需要对某个软件包进行开发,可以使用 -e(可编辑)这个参数来安装,这样你就可以直接编辑这个软件包,而不需要每次测试新功能时都卸载再安装 :)

撰写回答