将共享Python包添加到多个虚拟环境
当前的Python工作流程
我在我的Python 2.7环境中安装了pip、distribute、virtualenv和virtualenvwrapper(这是在Mac OS X上安装的框架版Python)。在我的~/.bash_profile
文件中,我有以下内容:
export PIP_DOWNLOAD_CACHE=$HOME/.pip_download_cache
这样就形成了如下的工作流程:
$ mkvirtualenv pip-test
$ pip install nose # downloaded and installed from PyPi
$ pip install mock # downloaded and installed from PyPi
$ mkvirtualenv pip-test2
$ pip install nose # installed from pip's download cache
$ pip install mock # installed from pip's download cache
问题
因为我没有下载已经在其他虚拟环境中安装过的包,所以这个工作流程节省了时间和带宽。不过,它并没有节省磁盘空间,因为每个包都会安装到每个虚拟环境中。因此,我在想:
- 问题 #1 有没有什么方法可以修改这个工作流程,让我在多个虚拟环境中共享一个没有安装在我的Python 2.7环境中的Python包,从而节省磁盘空间?
我尝试过使用add2virtualenv,这是virtualenvwrapper的一部分。虽然这个命令“将指定的目录添加到当前活动虚拟环境的Python路径中”,但它并不会添加virtualenv/bin
目录中的任何可执行文件。因此,以下操作会失败:
$ mkvirtualenv pip-test3
$ add2virtualenv ~/.virtualenvs/pip-test/lib/python2.7/site-packages/nose/
$ nosetests # Fails since missing ~/.virtualenvs/pip-test3/bin/nosetests
- 问题 #2 我是不是对
add2virtualenv
的工作原理理解错了? - 问题 #1 重新表述 有没有比add2virtualenv更好的方法,让多个虚拟环境可以引用一个没有安装在我的Python 2.7环境中的Python包?
- 问题 #3 如果有方法可以将一个共享的Python包安装到多个虚拟环境中,是否会有性能上的损失,相比于将Python包单独安装到每个虚拟环境中?
- 问题 #4 我是不是应该放弃节省磁盘空间,继续使用我现在的工作流程?
1 个回答
11
除非你在做嵌入式系统的开发,否则我觉得这样追求磁盘空间是没什么意义的。我花了很长时间才明白这一点,因为我成长的年代,硬盘很大的时候也不过几兆,而内存是用千字节来计算的。但现在,除非你有特别特殊的限制,否则让你的项目相互独立(也就是说,你可以删除系统中任何不在项目里的文件夹,而你的Python包依然存在)带来的好处,通常远远超过你为了节省磁盘空间而做的努力。根据我的经验,如果你在忙着开发,根本不会注意到这些空间的变化。
所以我想分享的经验教训就是:你不会注意到你失去的磁盘空间,但如果你在清理某个地方的文件夹时,导致其他正在开发的项目出问题,那你肯定会感受到影响。