Virtualenv 使用了错误的 python,即使它在 $PATH 中是第一个

Virtualenv uses wrong python, even though it is first in $PATH

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

我缩小了范围,发现当我调用 python 时,当我的 virtualenv 被激活时,它仍然会到达 /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 它会从正确的目录中抓取 python3.5(即 /home/liam/dev/.virtualenvs/noots/bin/python3.5

反正我没碰过/home/liam/dev/.virtualenvs/noots/bin/pythonpython3.5 仍然链接到该目录中的 python3。遍历到/home/liam/dev/.virtualenvs/noots/bin/和运行宁./python./python3./python3.5都正常

我正在使用 virtualenvwrapper 如果这有所不同,但是问题似乎是最近发生的,在安装 virtualenvvirtualenvwrapper

很久之后

正如评论中 tdelaney 所建议的那样,我 运行 alias 发现我之前在我的 [=13] 中将 python 别名为 /usr/bin/python3.5 =].

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

如果您没有得到 which 说您应该得到的程序,您需要在比平台执行者更高的链上查找。 Shell 通常有一种方法来为命令添加别名,并且在大多数 unixy shells 上,您只需输入 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 ~ $ 

这很好,因为非 shell 程序 运行 python 获得与我相同的程序,并且虚拟环境自然工作。

我的问题是我最近 将我的 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 的第一行修改为 link 到真正的 python 路径。

在 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

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

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

virtualenv -p /venv/bin/python3 env

但权限被拒绝。 所以我尝试了:

sudo chmod 777 -R /venv/bin