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

时间:2017-01-07 17:25:45

标签: python linux virtualenv virtualenvwrapper

我遇到了一个问题: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/pythonpython3.5仍然与该目录中的python3相关联。遍历/home/liam/dev/.virtualenvs/noots/bin/并正在运行./python./python3./python3.5一切正常。

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

6 个答案:

答案 0 :(得分:5)

在评论中提到tdelaney时,我运行了alias,发现我之前在我的python中将/usr/bin/python3.5别名.bashrc

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分: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程序与我做的相同,虚拟环境自然地工作。

答案 3 :(得分:1)

在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

答案 4 :(得分: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。我想这对订单解决无关紧要。

答案 5 :(得分:0)

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

virtualenv -p /venv/bin/python3 env

并获得了拒绝的许可。 所以我试过了:

sudo chmod 777 -R /venv/bin