代码之家  ›  专栏  ›  技术社区  ›  Jacob Lyles

Virtualenv不应该使用系统包时

  •  2
  • Jacob Lyles  · 技术社区  · 15 年前

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

    为什么会这样?当我激活了一个virtualenv时,我如何才能使用virtualenv包?

    如果有关系的话,我在苹果操作系统上。

    我的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
    

    (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()
    

    (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 回复  |  直到 15 年前
        1
  •  1
  •   xnine    15 年前

    我一直在试图复制你的问题,但运气不好。

    激活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.
    >>> 
    
        2
  •  1
  •   Jacob Lyles    15 年前

    感谢xnine的回复,我想到了检查我的.bashrc文件。我把这些台词注释掉了:

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

    其中一个成功了。