Virtualenv 使用错误的 python,即使它位于 $PATH 中的第一个

问题描述 投票:0回答:8

我遇到了一个问题,

python
在 virtualenv 中找不到 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
它会从正确的目录中获取 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

很久之后
python linux virtualenv virtualenvwrapper
8个回答
57
投票

我的问题是我最近我的项目与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

要解决此问题,只需更新

VIRTUAL_ENV
脚本中的
activate
即可。

此外,您可能需要修复

bin/pip
的第一行以链接到真实的 python 路径。


14
投票

正如 tdelaney 在评论中建议的那样,我运行了

alias
并发现我之前在我的
python
中将
/usr/bin/python3.5
别名为
.bashrc

我从我的

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


8
投票

如果你没有得到

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 程序与我一样,并且虚拟环境自然地工作。


2
投票

在 Cygwin 上,即使我创建了将

/usr/bin/python
指向
F:\Python27\python.exe
的符号链接,我仍然遇到问题。这里,
source env/Scripts/activate
之后,
which python
仍然是
/usr/bin/python

经过很长一段时间,我找到了解决办法。即使您创建了符号链接,也必须使用

virtualenv env
,而不是使用
virtualenv -p F:\Python27\python.exe env


0
投票

我现在也遇到同样的问题。 Virtualenv 是在 Windows 中创建的,现在我尝试从 WSL 运行它。 在 virtualenv 中,我将 python.exe 重命名为 python3.exe(因为我在 WSL 中只有 python3 命令)。在 $PATH 中,我的 virtualenv 文件夹位于第一个,没有 python 的别名。我收到

which python3
/usr/bin/python3
。在
/usr/bin/python3
中有符号链接 `python3 -> python3.6。我想这对于订单解析来说并不重要。


0
投票

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

virtualenv -p /venv/bin/python3 env

并获得许可被拒绝。 所以我尝试了:

sudo chmod 777 -R /venv/bin

0
投票

which python
print(sys.executable)
他们不同意我的观点。这意味着使用活动的 virtualenv
pip install <package>
将安装到 virtualenv,但运行
python
将是基本安装。

我最终通过跑步解决了这个问题

virtualenv -p \path\to\python.exe --always-copy <venvName>

我不确定指定原始 python 的路径是否真的有必要,但也没什么坏处。根据手册页:

 --copies, --always-copy       try to use copies rather than symlinks, even when symlinks are the default for the platform (default: False)

我正在使用 Windows powershell 和 msys64。


0
投票

造成这种情况的原因也可能是文件权限错误。例如,如果环境是从具有错误权限的备份中恢复的,就像我的情况一样。如果在您自己的环境中没有可执行权限,它将回退到默认路径。更改权限后

chmod -R 755 py3Env/

再次选择了我的环境中正确的 python 可执行文件。

© www.soinside.com 2019 - 2024. All rights reserved.