【问题标题】:"python" still runs the system version after virtualenv activate“python”在 virtualenv 激活后仍然运行系统版本
【发布时间】:2016-12-06 20:02:50
【问题描述】:

我使用以下命令安装了 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,所以我不太担心。

【问题讨论】:

  • 你可以在 virtualenv 中运行which python 来检查它。看起来你的系统 python 仍在运行
  • $ which python alias python='/usr/bin/python' /usr/bin/python
  • 对。哪个不是/usr/local/bin/python2.7
  • 您必须编辑您的PATH 变量并确保/usr/local/bin//usr/bin/ 之前
  • 是的,但为什么忽略 --python=/usr/local/bin/python2.7 ?还有什么在这里玩

标签: python unix virtualenv


【解决方案1】:

您可能已将路径上的文件夹移动/重命名为venv

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

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

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

当您移动/重命名文件夹时,过时的 VIRTUAL_ENV 路径会添加到您的 PATH,而您 activate。因此,python 的第一个匹配项将比PATH 更靠后,第一个匹配项很可能是系统python

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

【讨论】:

  • 谢谢!这解决了我的问题。我想知道为什么它突然停止工作了。
【解决方案2】:

底线:

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

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


WFM 与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。这就是“已使用...”消息的原因。如果是这种情况,您不需要传递 --python,因为默认情况下 virtualenv 已经在使用它(检查它的 shebang)。

不过,由于virtualenv 创建了一个无版本的可执行文件并且activate 改变了PATH,您应该将/var/python_venv/testbox/bin/python 设为python

  • 由于python 是您的别名,而activate 不使用别名 - 您必须在bash 启动脚本中设置它。

【讨论】:

  • 它对你有用,因为你没有 python 别名为系统 python。如果您在.bashrc 中添加alias python=/usr/bin/python,您将在运行python 时得到与OP 相同的结果。
  • @alvits 不应该——这就是我的目标。
  • 我的意思是你的帖子不是解决问题的办法。解决方案是摆脱别名。 Django 像声称的那样工作,因为它从未使用过别名。只有交互式 shell 使用别名。
  • @alvits 这也是我的解决方案。但我也在解释它。
  • 如何在 Kubuntu 17.10 中删除别名。它在什么脚本中?
【解决方案3】:

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

修复步骤:

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

【讨论】:

    【解决方案4】:

    如果您使用的是 Windows,这似乎对我有用。

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

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      相关资源
      最近更新 更多