为什么我的virtualenv的pip列表包在我的lib / python2.7目录中?

时间:2016-05-18 01:06:51

标签: python virtualenv virtualenvwrapper

在我家里,我有一个名为lib/python2.7的目录(对于不同的python版本,实际上有五个这样的目录)。由于这是一个共享主机(Webfaction),该目录对我来说至关重要。在那里,我安装了virtualenvvirtualenvwrapper等内容,因为作为共享主机的客户,我无法访问sudo并安装全局包。

然而,当我创建一个virtualenv:

$ mkvirtualenv myenvironment
$ workon myenvironment
$ which pip
# outputs the myenvironment's path to pip
$ pip freeze

该命令显示我的lib/python2.7下的整个包列表(这包括相同的virtualenv包,以及由于......遗留原因导致的冲突包)。如果我想在lib/python2.7中安装一个包名称的包,这也会让我感到很恼火,因为它不允许我更新它。

workon环境中,我尝试检查PYTHONPATH是否有奇怪的东西,但它是空的:

$ echo $PYTHONPATH
# shows a blank line

如果我从任何虚拟环境中尝试该命令,它也是空的。

似乎--no-site-packages是默认值,但只能解决部分问题。这意味着:pip freeze | wc -l在环境中显示的值比在全局执行时显示的值低于任何环境,这告诉我某些已经提供的包被排除并且来自托管本身(而不是由我安装,因为托管是共享,我无法访问全球空间。)

我的问题是:我该如何解决这个问题?我希望我的virtualenv不会列出$HOME/lib/python2.7

中的包

请避免愚蠢地链接到this question,没有什么是有用的,但仍然没有接受的答案。我在阅读并尝试该问题中的每个解决方案之后写了这个问题

2 个答案:

答案 0 :(得分:0)

我认为你需要指定python版本。您可以使用

之类的命令指定要使用其创建虚拟环境的python版本
virtualenv -p /usr/bin/python3.4 virt/virtname --no-site-packages

因为当你没有指定python版本时,virtualenv会创建一个带有pythonv2.7的环境,因此所有的包最终都会出现在你提到的文件夹中。

答案 1 :(得分:0)

深挖后找到解决方案。 这是一个Webfaction自定义但如果出现问题,这可能适用于此类任何安装。

问题的核心是 Webfaction为我们配置了sitecustomize.py文件。该文件位于/usr/local/lib/pythonX.Y/sitecustomize.py并自行添加~/lib/pythonX.Y的内容(如果您在其目录下工作以运行python,则有条件地添加~/webapps下任何python应用程序的内容脚本)。

即使virtualenv的python可执行文件是另一个,它也会在每次运行时加载所说的sitecustomize.py文件,就像基本的python可执行文件一样。

这里有解决方法吗?在virtualenv中创建一个空的sitecustomize.py来覆盖另一个:

touch ~/.virtualenvs/yourvenv/lib/pythonX.Y/sitecustomize.py

它会起作用。 Take this as reference if you are stuck here like I was

备注:将每个案例的X.Y替换为您正在使用的相应版本。另外请记住:您不能删除或编辑基本sitecustomize.py,因为您在共享主机中,在这种情况下。但是,只要你为每个想要的虚拟对象执行此操作,覆盖将适用于每个案例。