我知道virtualenv,如果在创建新的虚拟环境时没有传递--no-site-packages
参数,会将/usr/local/lib/python2.7/site-packages
(对于Python 2.7)中的包与新创建的虚拟环境链接起来。在Ubuntu 12.04 LTS上,我有三个可以安装Python 2.7软件包的位置(使用默认的,Ubuntu提供的Python 2.7安装):
/usr/lib/python2.7/dist-packages
:这有我的全局安装的ipython,scipy,numpy,matplotlib - 如果不能通过scipy stack获得,我会发现单独安装(及其所有依赖性)会很困难且耗时。/usr/local/lib/python2.7/site-packages
:这是空的,我认为它会在Ubuntu上保持这种状态,除非我从源代码安装一个软件包。/usr/local/lib/python2.7/dist-packages
:这里有非常重要的天文学包装,特别是那些与PyRAF,STScI等相关的包装,单独安装它们非常困难和耗时。请注意,我的系统上不存在/usr/lib/python2.7/site-packages
等全局目录。另请注意,我的ipython,scipy等全局安装让我可以即时使用这些软件包,而无需每次都使用/激活虚拟环境。
当然,我现在想使用virtualenv在我的用户主目录中创建一个虚拟环境,我将为未来的项目提供/激活。但是,我希望这个虚拟环境在创建时链接/复制上面列表中位置(1)和(3)中的所有包。这样做的主要原因是我不想通过pip install
进程(如果可能的话)重新安装ipython,scipy,astro-packages等,用于此(或许是其他)虚拟环境。
这是我的问题:
dist-packages
目录中的软件包以用于将来创建的虚拟环境?dist-packages
目录中更新scipy,ipython等的全局安装时,这还会更新/更改我的虚拟环境使用的软件包(以及它在virtualenv创建期间最初获得的软件包)吗?/usr/local/lib/python2.7/dist-packages
或/usr/local/lib/python2.7/site-packages
吗?在此先感谢您的帮助!
这可能是PYTHONPATH
的合法使用 - virtualenv
不接触的环境变量,它使用与环境变量PATH
相同的语法,在.bashrc或类似的bash PYTHONPATH=/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages
中。如果你沿着这条路走
pip install
总是使用/usr/local/lib/python2.7/dist-packages/用于我的Ubuntu)。如果你从虚拟环境中安装它们(当它被激活时),那么当然它将被置于虚拟环境中。我只是围绕着virtualenv,但是到目前为止,似乎有一个比提到的更简单的方法。
--system-site-packages
标志到virtualenv只需要在你的路径中获得dist-packages - 如果你使用Ubuntu发布的tweato virtualenv。 (This answer和this one给出了一些有用的历史)。我测试了这个,它确实有效。
$ virtualenv --system-site-packages .
python setup.py install
的测试后,它确实(再次像托马斯所说的那样)仍然进行了包装。你可以通过构建自己的python来改变它,但这有点极端。PYTHONPATH
为我工作。
vim ~/.bashrc
在下面添加以下行:
export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages:/usr/local/lib/python2.7/dist-packages
source ~/.bashrc
你想在这里实现的基本上是将特定文件夹(dist-packages
)添加到Python搜索路径。你有很多选择:
.pth
)文件,条目将附加到系统路径。PYTHONPATH
(来自它的条目转到系统路径的开头)。sys.path
,即向其附加所需的文件夹。我认为对于这个特殊情况(启用全局dist-packages
文件夹)第三个选项更好,因为第一个选项你必须为你将要使用的每个virtualenv创建.pth
文件(使用一些外部shell脚本?)。分发包装时很容易忘记它。第二个选项需要运行时设置(添加一个envvar),这也很容易错过。
并且只有第三个选项在配置或运行时不需要任何先决条件,并且可以毫无问题地分发(当然,在相同类型的系统上)。
你可以使用这样的函数:
def enable_global_distpackages():
import sys
sys.path.append('/usr/lib/python2.7/dist-packages')
sys.path.append('/usr/local/lib/python2.7/dist-packages')
然后在你的包的__init__.py
文件中:
enable_global_distpackages()