Virtualenv 在不应该使用系统包时使用

Posted

技术标签:

【中文标题】Virtualenv 在不应该使用系统包时使用【英文标题】:Virtualenv using system packages when it should not 【发布时间】:2010-09-08 22:30:31 【问题描述】:

我使用 --no-site-packages 选项创建了一个 virtualenv 环境。激活 virtualenv 后,我注意到在“python”提示符处导入 psycopg2 会导入我拥有的过时系统库,但在“python2.6”提示符处导入它会将我安装的库的较新版本导入 virtualenv .

这是为什么?激活 virtualenv 后,如何仅使用 virtualenv 包?

如果重要的话,我在 OS X 上。

编辑以回应以下 Jeff 的 cmets:

在我的 virtualenv /bin 目录中有“python”和“python2.6”可执行文件。 “python2.6”是“python”的符号链接,“python”是二进制文件。

(ice_development)[jacob@Beagle:~] $ ls -l Virtualenv/ice_development/bin/
total 264
-rw-r--r--  1 jacob  staff   2086 Sep  8 18:13 activate

 .....

-rwxr-xr-x  1 jacob  staff  50720 Sep  8 18:13 python
lrwxr-xr-x  1 jacob  staff      6 Sep  8 18:13 python2.6 -> python

激活ENV后,“which python”和“which python2.6”都指向ENV目录。

(ice_development)[jacob@Beagle:~] $ which python
/Users/jacob/Virtualenv/ice_development/bin/python
(ice_development)[jacob@Beagle:~] $ which python2.6
/Users/jacob/Virtualenv/ice_development/bin/python2.6
(ice_development)[jacob@Beagle:~] $ 

此外,在命令行中使用可执行文件后的提示符是相同的。

(ice_development)[jacob@Beagle:~] $ python2.6
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> psycopg2.__version__
'2.2.2 (dt dec ext pq3)'
>>> quit()

(ice_development)[jacob@Beagle:~] $ python
Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> psycopg2.__version__
'2.0.13 (dt dec ext pq3)'
>>> quit()

~/ENV/lib/python2.6/site-packages 目录包含新版本的 psycopg2 (2.2.2):

(ice_development)[jacob@Beagle:~] $ ls Virtualenv/ice_development/lib/python2.6/site-   packages/
Twisted-10.1.0-py2.6-macosx-10.6-universal.egg       setuptools-0.6c11-py2.6.egg
easy-install.pth                                     setuptools.pth
pip-0.7.2-py2.6.egg                                  txpostgres-0.3.0-py2.6.egg
psycopg2                                             zope.interface-3.6.1-py2.6-macosx-    10.6-universal.egg
psycopg2-2.2.2-py2.6.egg-info

但是,在不同的提示下导入 psycopg2 会导入两个不同的版本。

【问题讨论】:

提示是相同的,因为它们都使用相同的构建。我的 2.6 virtualenv 和 non-virtual 也共享相同的时间戳 【参考方案1】:

我一直在尝试复制您的问题,但没有成功。

激活 virtualenv 后会出现这样的提示:

jeff@DeepThought:~$ source ~/ENV/bin/activate
(ENV)jeff@DeepThought:~$ 

这主要是将 ~/ENV/bin 添加到搜索路径的前面,因此当我键入“python”时,我在该 bin 中安装的版本首先出现。就我而言,我全局安装了 2.6,虚拟安装了 2.7。

(ENV)jeff@DeepThought:~$ python
Python 2.7 (r27:82500, Sep  8 2010, 20:09:26) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

我对您的案例感到奇怪的是,您说您在虚拟环境中拥有更新的库,但您只能使用 python2.6 访问它们。除非您自己创建它,否则 ~/ENV/bin 甚至不应该有 python2.6 可执行文件。如果你已经激活了 virtualenv,输入 python 应该会带你进入 virtualenv python shell,输入 python2.6 会带你到全局 python shell。如果是这种情况,您应该会看到与您所说的相反的情况。

我要做的第一件事是检查运行 python 和 python2.6 时正在执行的内容:

(ENV)jeff@DeepThought:~$ which python
/home/jeff/ENV/bin/python
(ENV)jeff@DeepThought:~$ which python2.6
/usr/bin/python2.6

这看起来是我所期望的。你的是什么样子的?如果你的也是这样,也许你只需要进入 ~/ENV/lib/python2.6/site-packages/ 并删除给你带来麻烦的文件,用更新的文件替换它们。

编辑:别名优先于搜索路径:

jeff@DeepThought:~$ echo $PATH
/home/jeff/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
jeff@DeepThought:~$ cat > /home/jeff/bin/hello.sh
#!/bin/bash
echo "hello world"
jeff@DeepThought:~$ chmod +x ~/bin/hello.sh 
jeff@DeepThought:~$ hello.sh
hello world
jeff@DeepThought:~$ which hello.sh
/home/jeff/bin/hello.sh
jeff@DeepThought:~$ alias hello.sh=/usr/bin/python
jeff@DeepThought:~$ which hello.sh
/home/jeff/bin/hello.sh
jeff@DeepThought:~$ hello.sh
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

【讨论】:

同时检查模块搜索路径sys.path,每个:python -c 'import sys;print(sys.path)'python2.6 -c ... “python”可执行文件的搜索路径更长,包括我不想导入的 /Library/Python/2.6/site-packages 中的第三方系统包。【参考方案2】:

感谢 xnine 的回复,我有了检查 .bashrc 文件的想法。我注释掉了这些行:

export PATH=/usr/bin/python2.6:$PATH
alias python="/usr/bin/python2.6"
alias pdb='python -m pdb'

其中一个成功了。

【讨论】:

绝对是别名。它优先于搜索路径。请参阅我帖子编辑部分中的示例。

以上是关于Virtualenv 在不应该使用系统包时使用的主要内容,如果未能解决你的问题,请参考以下文章

系统包

flask

如何为系统包设置自动完成

使用系统包DBMS_ALERT监视表

如何使用win32diskimager-binary工具把ISO系统包刷到U盘

在系统包中播放下载的视频