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/
。 python
和 python3.5
仍然链接到该目录中的 python3
。遍历到/home/liam/dev/.virtualenvs/noots/bin/
和运行宁./python
、./python3
或./python3.5
都正常
我正在使用 virtualenvwrapper
如果这有所不同,但是问题似乎是最近发生的,在安装 virtualenv
和 virtualenvwrapper
很久之后
正如评论中 tdelaney 所建议的那样,我 运行 alias
发现我之前在我的 [=13] 中将 python
别名为 /usr/bin/python3.5
=].
我从我的 .bashrc
、运行、unalias python
和 source ~/.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/python
到 F:\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
我遇到了一个问题,在 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/
。 python
和 python3.5
仍然链接到该目录中的 python3
。遍历到/home/liam/dev/.virtualenvs/noots/bin/
和运行宁./python
、./python3
或./python3.5
都正常
我正在使用 virtualenvwrapper
如果这有所不同,但是问题似乎是最近发生的,在安装 virtualenv
和 virtualenvwrapper
正如评论中 tdelaney 所建议的那样,我 运行 alias
发现我之前在我的 [=13] 中将 python
别名为 /usr/bin/python3.5
=].
我从我的 .bashrc
、运行、unalias python
和 source ~/.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/python
到 F:\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