【问题标题】:python virtualenv does not use correct version of pythonpython virtualenv 没有使用正确版本的 python
【发布时间】:2015-07-06 20:43:34
【问题描述】:

我正在创建一个需要我使用 python2.7.6 的 Django 应用程序。我的系统安装了 python3.4.1,所以我必须使用安装了 python2.7 的 virtualenv。我使用 Pycharm 安装了这样一个 virtualenv 并将其命名为 django_python_2.7 但是当我在终端中激活它并运行“python”时,它仍然显示它正在使用系统的 python3.4.1: 这是我所做的:

  1. 激活环境:

    source django_python_2.7/bin/activate

  2. 运行python,它显示:

    Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 00:54:21) ---> 这是系统级别的python,而不是安装在virtualenv中的那个

但是,当我运行which python 时,它显示了指向 virtualenv 的 python 版本的正确路径:

/Users/calvinmwhu/....../django_python_2.7/bin/python

当我显式运行安装在该 virtualenv 中的 python 版本时:

django_python_2.7/bin/python

它显示了正确的版本:

Python 2.7.6 (default, Sep  9 2014, 15:04:36) 

我不知道发生了什么。我正在 Pycharm IDE 中开发这个应用程序,但我真的很喜欢在终端中执行命令。但是在终端中virtualenv没有使用正确版本的python..为什么在virtualenv中运行一个简单的“python”命令仍然默认为系统的python?

谁能提供一些提示?是否需要更改PATH 变量以使其包含virtualenv 的python 的路径?

【问题讨论】:

  • 你是怎么配置zshrc或者bashrc的?
  • PATH 变量会在您激活环境时自动设置。试试 virtualenv -p /usr/bin/python2.7
  • 我没有在 bashrc 配置文件中配置任何 python。但是一件奇怪的事情是,当我在项目根目录中运行:“python manage.py shell”时,它使用了系统级别的python。但是当我简单地运行“manage.py shell”时,它使用了正确的版本(安装在 virtualenv 中的那个)!!为什么会发生这种情况?
  • python2.7 可执行文件在哪里?如果您使用的是ubuntu,那么不会有任何问题。在 virtualenv 之外运行 which python2
  • 它只是位于 /usr/bin

标签: python python-2.7 virtualenv


【解决方案1】:

如果要更改 virtualenv 中使用的 PYTHONPATH,可以将以下行添加到 virtualenv 的 django_python_2.7/bin/activate 文件中

export PYTHONPATH="/path/to/python"
export OLD_PYTHONPATH="$PYTHONPATH"

要在停用时恢复到其原始值,您可以在 django_python_2.7/bin/postdeactivate 脚本中添加以下行。

export PYTHONPATH="$OLD_PYTHONPATH"

否则,创建新的env 使用

virtualenv -p /usr/bin/python2.7 django_python_2.7

【讨论】:

  • 有没有办法在不更改任何路径变量的情况下解决这个问题?我没有在 bashrc 配置文件中配置任何 python。但是一件奇怪的事情是,当我在项目根目录中运行:“python manage.py shell”时,它使用了系统级别的python。但是当我简单地运行“./manage.py shell”时,它使用了正确的版本(安装在 virtualenv 中的那个)!!为什么会发生这种情况?
  • 如果你还没有准备好更改路径变量,为什么不创建新的环境呢?另外检查bin/activate脚本。你可以在那里找到
  • @itzMEonTV,谢谢你的回答。但是export OLD_PYTHONPATH="$PYTHONPATH"不应该在export PYTHONPATH="/path/to/python"之前吗?
【解决方案2】:

我发现了同样的问题...

就像提到的@skyline75489:

我忘记了我之前为我的 python3 可执行文件声明了一个别名。
我在我的主目录的 .bash 文件中找到它并将其删除。
在我的虚拟环境中一切都恢复正常了。

【讨论】:

    【解决方案3】:

    如果您更改了 venv 的路径或更改了 venv 目录的任何父文件夹,那么这将破坏配置的路径,如果这种情况您有两个选择:

    1. 重新创建它

      • 使用以下命令创建 requirements.txt 文件:pip freeze > requirements.txt

      • 删除venv目录:rm -r old-vnev/

      • 使用正确的名称创建一个新的 virtualenv:python -m venv new-venv
      • 激活新的虚拟环境:source new-venv/bin/activate
      • 从 requirements.txt 安装包:pip install -r requirements.txt
    2. 另一种更简单的方法

      • 搜索所有出现的字符串old/path/to/your/venv/
      • 将它们替换为correct/path/to/your/venv/

    之后source new-venv/bin/activate 将再次按预期工作。

    希望对您有所帮助!

    【讨论】:

      【解决方案4】:

      如果它对其他人有帮助:如果您更改了 venv 文件夹的路径(例如更改父文件夹),则会发生这种情况。这是我的问题。

      重新创建您的 virtualenv 将修复它,因为您应该希望创建一个 requirements.txt 来重建您的 virtualenv。

      这甚至可能是 OP 的根本原因。

      【讨论】:

        【解决方案5】:

        仔细检查您的路径。我最近遇到了这样的问题,在激活的 virtualenv 中运行 which python 仍会返回默认系统版本 (/usr/bin/python)。但是,如果我从 virtualenv 中直接运行指定二进制文件(./venv/bin/python 等)的脚本,它会按预期工作,因此所有依赖项似乎都已正确安装。

        问题是我在构建所有内容之后 移动了父 virtualenv 目录。这意味着所有 virtualenv 路径都指向不再有效的原始位置,并且 python 正确默认为默认系统二进制文件。

        【讨论】:

          【解决方案6】:

          我使用这样的bash 脚本:

          $ source venv/bin/activate
          $ alias vpython=$VIRTUAL_ENV/bin/python3
          

          如果想在虚拟环境中使用 python 可执行文件,请使用vpython。检查您在python实际使用哪个可执行文件的好方法如下:

          >>> import sys
          >>> print(f'executable \033[0;33;40m{sys.executable}\033[0m')
          

          【讨论】:

            【解决方案7】:

            在我的情况下,来自 virtualenv 的系统更新符号链接不知何故被破坏,它切换到默认系统 python 版本。解决方案是用正确的符号链接替换符号链接。

            1. 如果您在里面,请通过以下方式停用虚拟环境:

              deactivate

            2. 更改 virtualenv python 符号链接:

              ln -s /your/wanted/python/bin/python /your/virtualenv/bin/python

            3. 再次启动 virtualenv,它应该使用正确的 python 版本。

            如果您不确定您的 python 在哪里,那么您可以通过以下方式对其进行本地化: which python3

            【讨论】:

              【解决方案8】:

              我遇到了类似的问题。但我拥有它是因为我已将我的 env 文件夹移动到另一个地方。因此,如果您这样做了,只需转到 bin 文件夹中的 activate file 并更改 VIRTUAL_ENV="CurrentPathToYourEnvFolder"(它是文件中的第 40 行)

              【讨论】:

                最近更新 更多