在使用virtualenv时如何将Git子模块加入pythonpath
我在一个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 个回答
把你安装的所有软件包都记录在一个需求文件里,通常叫做 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(可编辑)这个参数来安装,这样你就可以直接编辑这个软件包,而不需要每次测试新功能时都卸载再安装 :)