【问题标题】:Virtualenv uses wrong python, even though it is first in $PATHVirtualenv 使用了错误的 python,即使它在 $PATH 中是第一个
【发布时间】:2017-05-22 07:34:00
【问题描述】:

我遇到了一个问题,python 在 vi​​rtualenv 中找不到 pip 安装的模块。

我缩小了范围,发现当我在激活我的 virtualenv 时调用 python 时,它仍然到达 /usr/bin/python 而不是 /home/liam/dev/.virtualenvs/noots/bin/python

当我在 virtualenv 中使用 which python 时,我得到:

/home/liam/dev/.virtualenvs/noots/bin/python

当我在 virtualenv 中查找我的 $PATH 变量时,我得到:

bash: /home/liam/dev/.virtualenvs/noots/bin:/home/liam/bin:/home/liam/.local/bin:/home/liam/bin:/home/liam/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin: No such file or directory

但当我实际运行 python 时,它会转到 /usr/bin/python

为了让我更困惑,如果我运行python3.5,它会从正确的目录(即/home/liam/dev/.virtualenvs/noots/bin/python3.5)抓取python3.5

无论如何我都没有碰过/home/liam/dev/.virtualenvs/noots/bin/pythonpython3.5 仍然都链接到该目录中的 python3。遍历到/home/liam/dev/.virtualenvs/noots/bin/,运行./python./python3./python3.5都正常。

我正在使用virtualenvwrapper,如果这会有所不同,但是问题似乎是最近出现的,在安装virtualenvvirtualenvwrapper 很久之后

【问题讨论】:

  • 在命令行运行alias,看看python是否已经被别名化了。
  • 啊,谢谢!这就是问题所在。
  • 请发布解决方案,因为这是一个有趣的问题。

标签: python linux virtualenv virtualenvwrapper


【解决方案1】:

我的问题是我最近将带有 virtualenv 的项目移动到另一个位置,因为这个 activate 脚本有错误 VIRTUAL_ENV 路径。

$ cat path_to_your_env/bin/activate

... # some declarations

VIRTUAL_ENV="/path_to_your_env/bin/python"  # <-- THIS LINE
export VIRTUAL_ENV

... # some declarations

要解决此问题,只需在 activate 脚本中更新 VIRTUAL_ENV

另外,您可能需要修复 bin/pip 的第一行以链接到真正的 python 路径。

【讨论】:

  • 我重命名了我的项目文件夹名称并遇到了同样的问题。
  • 我可以理解。这实际上帮助了我。
  • 如果我可以补充一点,您需要在 VIRTUAL_ENV 指定的是虚拟环境的路径,而不是 python 所在的位置
  • 谢谢!到处看了看。很难用语言来表达这个问题。这么简单
  • 这对我有用,虽然我不记得移动任何东西。
【解决方案2】:

按照 cmets 中的tdelaney 建议,我运行alias 并发现我之前在.bashrc 中将python 别名为/usr/bin/python3.5

我从.bashrc 中删除了该别名,运行unalias pythonsource ~/.bashrc,问题就解决了。

【讨论】:

    【解决方案3】:

    如果你没有得到which 说你应该得到的程序,你需要寻找比平台执行器更高的链。 Shell 通常有一种别名命令的方法,在大多数 unixy shell 上,您只需输入 alias 即可查看哪些命令已被重新映射。然后只需转到 shell 的配置文件并删除别名即可。

    有时人们使用别名python 试图找出他们应该使用哪个python。但通常还有其他更好的方法。例如,在我的 linux 机器上,python3 在路径中,但它是我正在使用的真正 python 的符号链接。

    td@mintyfresh ~ $ which python3
    /usr/bin/python3
    td@mintyfresh ~ $ ls -l /usr/bin/python3
    lrwxrwxrwx 1 root root 9 Feb 17  2016 /usr/bin/python3 -> python3.4
    td@mintyfresh ~ $ 
    

    这很好,因为运行 python 的非 shell 程序和我一样,虚拟环境自然地工作。

    【讨论】:

    • 我在您的回答中没有看到使用 alias 的示例。你谈论一件事,然后展示另一件令人困惑的例子,仅此而已。抱歉,如果我未能立即传达我的意思。
    • @AdamJagosz - 我建议不要使用别名 python,所以不需要展示如何去做。我展示了一个示例,说明 linux debs 和 rpms 通常如何使用符号链接来处理别名问题。
    • @AdamJagosz 以防万一,别名通常在您的 ~/.bashrc 或类似文件中设置(取决于您的 shell)。我不确定 Python 安装程序是否将别名放在那里,但在我的情况下,错误地放了一个。
    【解决方案4】:

    在 Cygwin 上,即使我创建了指向 /usr/bin/pythonF:\Python27\python.exe 的符号链接,我仍然遇到问题。这里,source env/Scripts/activate 之后,which python 仍然是/usr/bin/python

    经过很长时间,我想出了一个解决方案。即使您创建了符号链接,也必须使用 virtualenv -p F:\Python27\python.exe env,而不是使用 virtualenv env

    【讨论】:

      【解决方案5】:

      我目前遇到了同样的问题。 Virtualenv 是在 Windows 中创建的,现在我正在尝试从 WSL 运行它。 在 virtualenv 中,我将 python.exe 重命名为 python3.exe(因为我在 WSL 中只有 python3 命令)。在 $PATH 我的 virtualenv 文件夹是第一个,python 没有别名。我收到which python3 /usr/bin/python3。在/usr/bin/python3 中有符号链接`python3 -> python3.6。我想这对订单解决无关紧要。

      【讨论】:

        【解决方案6】:

        遇到了完全相同的问题。 我跑了:

        virtualenv -p /venv/bin/python3 env
        

        并获得了拒绝的权限。 所以我尝试了:

        sudo chmod 777 -R /venv/bin
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-09
          • 2020-07-22
          • 2020-08-23
          • 1970-01-01
          • 2022-06-10
          • 1970-01-01
          • 2018-06-10
          • 2022-01-03
          相关资源
          最近更新 更多