"python" virtualenv激活后仍然运行系统版本

"python" still runs the system version after virtualenv activate

我使用这些命令安装了 Python 2.7:

./configure --prefix=/usr/local --enable-unicode=ucs4 --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
make && make altinstall

然后我创建了 virtualenv 指向 2.7 安装:

$ virtualenv --python=/usr/local/bin/python2.7 testbox
Already using interpreter /usr/local/bin/python2.7
New python executable in /var/python_venv/testbox/bin/python2.7
Also creating executable in /var/python_venv/testbox/bin/python
Installing setuptools, pip, wheel...done.
$ source testbox/bin/activate
(testbox) $ python
Python 2.6.6 ( , Aug 18 2016, 15:13:37)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

但如果我激活它,它指向 2.6.6:

cat /etc/redhat-release
CentOS release 6.6 (Final)

编辑:

我不确定为什么这不起作用,但我仍然可以在我的 Apache Django 应用程序中使用 virtualenv,所以我不太担心。

底线:

您已将“python”设置为 shell 别名(可能在您的 shell 启动脚本中)。当您键入“python”时,它会干扰 virtualenv 替换 运行 的工作。删除别名,就可以了。

您也不需要指定 --python=/usr/local/bin/python2.7 因为您正在使用 Python 安装中的 virtualenv,所以它已经默认使用它。


WFM with virtualenv 1.10.1:(请参阅下面的猜测)

$ virtualenv --python=/usr/local/bin/python2.7 testbox
Running virtualenv with interpreter /usr/local/bin/python2.7
New python executable in testbox/bin/python2.7
Also creating executable in testbox/bin/python
Installing Setuptools.........................................done.
Installing Pip................................................done.
$ ls -l testbox/bin/
total 40
-rw-r--r--. 1 root root 2194 Dec  7 03:06 activate
-rw-r--r--. 1 root root 1250 Dec  7 03:06 activate.csh
-rw-r--r--. 1 root root 2389 Dec  7 03:06 activate.fish
-rw-r--r--. 1 root root 1129 Dec  7 03:06 activate_this.py
-rwxr-xr-x. 1 root root  332 Dec  7 03:06 easy_install
-rwxr-xr-x. 1 root root  340 Dec  7 03:06 easy_install-2.7
-rwxr-xr-x. 1 root root  293 Dec  7 03:06 pip
-rwxr-xr-x. 1 root root  301 Dec  7 03:06 pip-2.7
lrwxrwxrwx. 1 root root    9 Dec  7 03:06 python -> python2.7
lrwxrwxrwx. 1 root root    9 Dec  7 03:06 python2 -> python2.7
-rwxr-xr-x. 1 root root 7788 Dec  7 03:06 python2.7

activate 做的主要事情是:

PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

我的猜测是您正在使用为 /usr/local/bin/python2.7 安装的 virtualenv 这就是 "Already using..." 消息的原因.如果是这种情况,您不需要传递 --python 因为 virtualenv 已经默认使用它(检查它的 shebang)。

尽管如此,由于 virtualenv 创建了一个无版本可执行文件并且 activate 改变了 PATH,您应该将 /var/python_venv/testbox/bin/python 作为 python.

  • 因为 python 是您的别名,并且 activate 不使用别名 - 您必须在 [=30] 中设置它=] 启动脚本。

如果你激活了你的 virtualenv 并且 which python 给你 /usr/bin/python 而不是 yourvirtualenv_path/bin/python 你可能在你的 .bashrc 中有一个 bash 别名或者.bash_aliases 个文件,和我一样。

修复步骤:

  1. 停用虚拟环境
  2. 检查 python 是 运行 的别名:type python
  3. 找到您的 python 别名并将其从 ~/.bash_aliases~/.bashrc
  4. 中删除
  5. 就我而言,我删除了 alias python='$(which python)' from ~/.bash_aliases
  6. 删除您的虚拟环境
  7. 刷新您的 .bash 文件:source ~/.bashrcsource ~/.bash_aliases
  8. 重新创建 virtualenv
  9. 激活虚拟环境
  10. 运行:which python 应该给出:yourvirtualenv_path/bin/python

如果你在 Windows,这似乎对我有用。

检查您的环境变量并将系统中的任何 Python 路径声明移动到用户环境变量。

您可能 moved/renamed 在 venv 路径上有一个文件夹。

venv/bin/activate 包含一个名为 VIRTUAL_ENV 的变量(用于在激活 venv 时更新路径)并且这可能具有对原始 [=11= 的硬编码引用] 位置。

VIRTUAL_ENV="/Users/<user-name>/<original-path>/venv"
export VIRTUAL_ENV

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

当您 move/rename 文件夹时,过时的 VIRTUAL_ENV 路径会添加到您的 PATH 当您 activate 时。因此,python 的第一个匹配项将在 PATH 之后,第一个匹配项很可能是系统 python.

您应该在 venv 文件夹中更新这些过时的硬编码路径。