Pipenv: 无法在 Ubuntu 18.04 下安装,中断 pip(“ImportError: cannot import name main”)

创建于 2018-05-02  ·  30评论  ·  资料来源: pypa/pipenv

我想在 Ubuntu 18.04 下安装 pipenv。 当我这样做时,它会破坏 pip / pip3。

预期结果

pipenv 的安装和工作版本。

实际结果

pip / pip3 坏了,这取决于我是想通过 pip 还是 pip3 安装 pipenv。

➜ pip
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main
复制步骤
  1. 设置 Ubuntu 18.04
  2. 运行pip install pipenvpip3 install pipenv
  3. 运行pippip3 - 打印错误,pip / pip3 不再工作。

为了解决这个问题,我必须运行:

sudo python -m pip uninstall pip && sudo apt install python-pip --reinstall
sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall

但是我无法使用 pip 安装 pipenv。 通过apt安装不起作用,因为没有可用的


解决方案

请参阅下面

export PATH="${HOME}/.local/bin:$PATH"

在您的外壳配置中。 如果路径不存在,它将不起作用。

最有用的评论

啊,我现在知道是什么问题了,谢谢。 从未想过路径会影响这一点,这就是为什么我没有想到将它包含在问题描述中。 很抱歉,并感谢您的帮助。

对我来说修复它的是添加

export PATH="${HOME}/.local/bin:$PATH"

到个人资料。

编辑:确保您运行hash -r或输入一个新的 shell 以使此更改生效。

我认为我们可以做很多事情来独立解决它

也许可以有一些更详细的安装说明或警告? 我对 pip 的工作原理不太了解,但我可能已经阅读了有关路径问题的说明。 但我猜想,对于一个简单的规则来说,不同包管理器和发行版的生态系统太复杂了……

所有30条评论

这是 pip3 的输出:

werner in ~ at octopus23
➜ pip3 install pipenv
Collecting pipenv
  Using cached https://files.pythonhosted.org/packages/2c/01/37a5867a47d52856b077d0faa561b791cb6e6e3e9410837b6d62f569c1e6/pipenv-11.10.1-py3-none-any.whl
Collecting virtualenv (from pipenv)
  Using cached https://files.pythonhosted.org/packages/ed/ea/e20b5cbebf45d3096e8138ab74eda139595d827677f38e9dd543e6015bdf/virtualenv-15.2.0-py2.py3-none-any.whl
Collecting pip>=9.0.1 (from pipenv)
  Using cached https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl
Collecting setuptools>=36.2.1 (from pipenv)
  Using cached https://files.pythonhosted.org/packages/8c/10/79282747f9169f21c053c562a0baa21815a8c7879be97abd930dbcf862e8/setuptools-39.1.0-py2.py3-none-any.whl
Collecting virtualenv-clone>=0.2.5 (from pipenv)
  Using cached https://files.pythonhosted.org/packages/6d/c2/dccb5ccf599e0c5d1eea6acbd058af7a71384f9740179db67a9182a24798/virtualenv_clone-0.3.0-py2.py3-none-any.whl
Collecting certifi (from pipenv)
  Using cached https://files.pythonhosted.org/packages/7c/e6/92ad559b7192d846975fc916b65f667c7b8c3a32bea7372340bfe9a15fa5/certifi-2018.4.16-py2.py3-none-any.whl
Installing collected packages: virtualenv, pip, setuptools, virtualenv-clone, certifi, pipenv
Successfully installed certifi-2018.4.16 pip-10.0.1 pipenv-11.10.1 setuptools-39.1.0 virtualenv-15.2.0 virtualenv-clone-0.3.0

我猜这可能是 Pipenv 取决于 pip 的结果,但我不确定 Pipenv 是否应该对此负责。 也许 Debian 应该这样做,因为是他们打破了 Python-pip 耦合。 Pipenv 当然也不是唯一依赖于 pip 的软件包,但我不确定这里的最佳实践是什么。

@ncoghlan你能就这个话题提供一些见解吗? 具体来说

  1. 一个包应该依赖于 pip 吗?
  2. 如果 1. 是的话,它是否应该负责与系统包管理器的这种冲突?
  3. 如果 2. 是,如何?
  4. 2. 否,谁来负责? 是否应指示用户改用变通方法?

无论如何,您可能永远不应该在 Ubuntu 上使用sudo pip install任何东西。 您应该执行以下操作之一

  • 一直使用APT
  • pip install --user
  • 自定义管理器,例如 pipi

或者更好的是,完全避免使用系统 Python,而使用 pyenv 或其他 Python 运行时管理器。

抓那些。 从 APT 中避免使用 Python,句号。

无论如何,你可能永远都不应该在 Ubuntu 上安装任何东西

我实际上从未这样做过。 我知道在 Ubuntu 下使用sudo pip的问题,所以我尽可能使用apt或坚持使用--user

啊我现在看到问题了。 用户模块优先于系统模块,但/usr/bin $HOME/.local/bin在您的PATH之前在$HOME/.local/bin之前。 /usr/bin/python尝试导入系统pip安装(仍为9.x),但最终找到了用户安装(即10.x)。 真是一团糟。

2095 是一样的,但我想保持这个开放,因为我认为应该有一个更强大的解决方案,而不是依赖用户拥有友好的PATH

当用户具有以下功能时,它非常稳定:

  • ˜/.local/bin位于用户PATH的开头。 应该是 Ubuntu 上的默认值,因为16.10 。 拥有它是一个很好的做法,因为它支持pip install --user行为,这是一个完全有效的用例
  • 用户应始终使用pip install --user 。 在每个发行版中,弄乱系统的 pip 都非常糟糕,即使debian 中奇怪的“dist-packages/site-packages”文件夹也不能防止用户犯错。

我们已经在所有 ubuntu 用户安装中确保了这种行为(组织了超过 1000 次安装各种 ubuntu 版本),并且向 pip10 的过渡就像一个魅力。

虽然我同意 python 及其生态系统很复杂,如果人们不必正确配置他们的路径来获得正确的搜索顺序会更好,但不幸的是,这只是关于现在在包管理器中的安装方式的一个事实这本身并不完全是 pipenv 问题。 我不认为我们可以做很多事情来独立解决它,这更像是一个需要在 python 邮件列表上解决的问题

啊,我现在知道是什么问题了,谢谢。 从未想过路径会影响这一点,这就是为什么我没有想到将它包含在问题描述中。 很抱歉,并感谢您的帮助。

对我来说修复它的是添加

export PATH="${HOME}/.local/bin:$PATH"

到个人资料。

编辑:确保您运行hash -r或输入一个新的 shell 以使此更改生效。

我认为我们可以做很多事情来独立解决它

也许可以有一些更详细的安装说明或警告? 我对 pip 的工作原理不太了解,但我可能已经阅读了有关路径问题的说明。 但我猜想,对于一个简单的规则来说,不同包管理器和发行版的生态系统太复杂了……

@slhck实际上令人沮丧的是,这个 xkcd专门针对 python 环境以及 sudo 和包管理器安装

这是我在 Ubuntu 18.04 上成功使用的一个很好的分步指南:
https://phoikoi.io/2018/04/03/bootstrap-pipenv-debian.html

还有https://github.com/pypa/python-packaging-user-guide/issues/396 ,它讨论了我们是否能够提出清单或故障排除脚本来帮助人们识别和解决他们环境中的潜在问题。 我会在那里记下PATH / sys.path排序冲突的可能性。

谢谢, @slhck 。 您的导出解决方法为我节省了最多的时间; 我已将其添加到 /etc/profile.d 中。

我们在 Linux 上有 2 个级别的软件打包,这真的很愚蠢。 更糟糕的是,随着*buntus 的最新版本,其中之一(pip/pip3)的两种风格都被打破了。

我在 Launchpad 上写了它: https :

@texadactyl Debian 有这个政策(我忘记了它是什么),默认情况下不应该安装 pip,并且他们已经坚持了很多以前的抱怨。 这一传统深深植根于 Debian 的根源。 如果他们能够重新考虑这一点,我会感到很震惊,但我非常怀疑他们会这样做。

我在 Ubuntu 18 和 Python 3.6 上遇到了同样的问题

以下是我遵循的步骤:

1)首先我收到错误:

回溯(最近一次调用最后一次):
文件“/usr/bin/pip”,第 9 行,在
从 pip 导入主
导入错误:无法导入名称 main

2)我将 /user/bin/pip 文件修改为:

导入系统
from pip._internal import main as _main
如果 __name__ == '__main__':
sys.exit(main())

3)然后,它开始给我这个错误:

回溯(最近一次调用最后一次):
文件“/usr/bin/pip3”,第 11 行,在
sys.exit(main())
NameError: name 'main' 未定义

4)我将 /usr/bin/pip3 修改为:

导入系统
from pip._internal import main as _main
如果 __name__ == '__main__':
sys.exit(_main())

5)然后我开始收到错误:

回溯(最近一次调用最后一次):
文件“/usr/bin/pip3”,第 11 行,在
sys.exit(main())
NameError: name 'main' 未定义

6) 我将 main() 重命名为 _main(),瞧 .. 成功了!!! :) :)

虽然这可能已经为您解决了问题,但这是一个非常糟糕的建议。 您不应手动修改系统文件。 请查看我之前的评论以获取解决方案。

编辑: @slhck解决方案解决了它。 需要在你的路径中有~/.local/bin

在 ubuntu 16.04 上遇到同样的问题。

$ sudo apt install python3-pip
$ pip3 --version
pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)
$ python3 -m pip install --user pipenv
$ pip3 --version
Traceback (most recent call last):
  File "/usr/bin/pip3", line 9, in <module>
    from pip import main
ImportError: cannot import name 'main'

# revert back and fix pip
$ sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall

我只想补充一点,我也偶然发现了这个问题。 我已经将 ~/.local/bin 作为我路径中的第一件事。 问题是 bash 如何散列命令。 这个问题的解决办法在这里找到: https :

@thernstig是的,这是正确的 - 我在上面的解决方案中添加了必要的hash -r命令,我忘了明确提及。

@slhck没问题,很高兴我能帮忙

我意识到问题已经解决,但我发帖希望这可能有助于避免修改 PATH。 我今天在设置新的 Ubuntu 18.04 机器时遇到了这个问题,并且能够在没有 PATH 修改的情况下解决它,尽管我确实重新启动了(我相当确定注销/登录会起作用,但没有验证)。

通过python3-pip安装 pip3 并使用pip3 install --user pipenv安装 pipenv 后,我收到了主题错误。 当我在~/.profile (股票,我没有修改)中注意到以下内容时,我正准备使用@slhck的解决方法:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

好奇,我重新启动,果然,问题解决了,因为我的.local/bin现在位于我的 PATH 的开头并且 pip3 再次工作。

@jlitzingerdev我很确定路径是默认的,这只是我的系统的,因为我使用了不同的外壳和配置文件,我删除了它或从头开始构建它,因此我的“解决方法”不应该是必要的首先。 很高兴你弄清楚了。

@slhck确实如此,但在第一次登录时它可能不在 PATH 中,因为~/.local/bin可能不存在,或者这就是我的具体情况。

我们该做什么?

只想说谢谢你包括恢复命令,我在让 pip 再次工作时遇到了麻烦。

我想在 Ubuntu 18.04 下安装 pipenv。 当我这样做时,它会破坏 pip / pip3。

预期结果

pipenv 的安装和工作版本。

实际结果

pip / pip3 坏了,这取决于我是想通过 pip 还是 pip3 安装 pipenv。

➜ pip
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main
复制步骤
1. Set up Ubuntu 18.04

2. Run `pip install pipenv` or `pip3 install pipenv`

3. Run `pip` or `pip3` – the error is printed, and pip / pip3 do not work anymore.

为了解决这个问题,我必须运行:

sudo python -m pip uninstall pip && sudo apt install python-pip --reinstall
sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall

但是我无法使用 pip 安装 pipenv。 通过apt安装不起作用,因为没有可用的

我的 ubuntu 18 pip 中有 3 个 pip,pip3 和 pip3.6 pip 用于 2.7 pip3 用于 3.5,pip3.6 用于 3.6 现在 pip 显示 .local/bin 中的文件位置。 我从这里删除了文件 pip 和 pip3。 现在哪个 pip3 向我展示了 /usr/bin/pip3。 运行命令 sudo nano /usr/bin/pip3 将解释器的第一行更改为 !#/usr/bin/python3 到 #/usr/bin/python3.5。 为我工作。 我所有的点子都在工作。 我希望这有帮助

我的 ubuntu 18 pip 中有 3 个 pip,pip3 和 pip3.6 pip 用于 2.7 pip3 用于 3.5,pip3.6 用于 3.6 现在 pip 显示 .local/bin 中的文件位置。 我从这里删除了文件 pip 和 pip3。 现在哪个 pip3 向我展示了 /usr/bin/pip3。 运行命令 sudo nano /usr/bin/pip3 将解释器的第一行更改为 !#/usr/bin/python3 到 #/usr/bin/python3.5。 为我工作。 我所有的点子都在工作。 我希望这有帮助

真的不鼓励所有这些步骤。 您不应手动编辑/usr/bin 。 相反,尝试如上所述卸载 pip,然后通过apt重新安装。 这应该会让您获得正确的系统安装。 如果您随后遇到pipenv ,请打开一个新问题并描述您的问题,而不是尝试此类解决方法。

如上所述通过 apt 重新安装不会改变任何内容,因为它会生成相同的输出。 简单的状态是无法导入名称 main 并且在 python 解释器中执行 import pip 时,它确实将其导入为 module ,这意味着名称 main 在它试图查找的模块中不可用。 现在我没有盲目地建议上面的编辑。 作为一名软件爱好者,当我在 ubuntu14 上时,我检查了 pip 文件,它的代码与 ubuntu18 pip3 中的代码相同。 所以发生了什么变化。 预先打包的python版本确实如此。

因为python3.5和2.7的pip只在pip模块中定义了main。
并且python3.6在pip._internal中定义了它

现在上面两条语句解决了大家的问题

问题在于使用的解释器本身

蟒蛇3; 但它引用的是哪个python
只有 python 2.7 并更改为 ubuntu18 的开发人员可能会将 python 3 作为 python3.6

但是那些安装了 python3.4 pr 3.5 的人呢? 首先python3引用python3.5,现在升级后它将引用ppython3.6

所以 debian 处理它的方式破坏了它

仅仅说出正确的解释器就可以解决问题
两者都有错误

从 pip 导入主

from pip._internal import main as _main

谢谢
ps
在这一点上,我必须说,在其他平台上讲什么不该讲是可以的,但是在其他热情的开发人员来解决那里的麻烦的 github 上; 特别是当他们试图运行大量命令或编辑一些配置文件以使其运行时,我必须说不要太聪明以至于你开始阻止这样的人。

注意:如果不更改代码,新版本将无法运行。 他们将添加变通方法,以便它适用于每个卸载和安装它的人

我希望此时你会明白。 和平,不要再打扰我

@ r-tron18 很抱歉,您认为这是一个建设性的建议——不要让您修改系统文件。 从您在原始帖子中提供的小上下文来看,无法判断您是知道自己在做什么的有经验的用户,还是只是应用了他们可能在其他地方找到的解决方法。 我花了很多时间在各种故障排除和问答网站上,我想你会同意我们不应该鼓励用户尝试随机修复或sudo系统提供的文件,这通常会导致更多错误和混乱。 这更像是一个普遍的问题。

我仍然不相信你所建议的是一个可靠的解决方案。 并且:我们可以就该解决方案的优点进行民间讨论——GitHub 是我可以表达这一点的地方。

原因是:将/usr/bin/pip3的 shebang 更改为#!/usr/bin/python3.5只会让您陷入该版本。 它应该读#!/usr/bin/python3 ,这应该是指向/usr/bin/python3.6 (或您系统上当前存在的任何内容)的符号链接。 无论如何,任何 Python 升级都可能会更改该文件。

你说:

但是那些安装了 python3.4 pr 3.5 的人呢? 首先python3引用python3.5,现在升级后它将引用ppython3.6
所以 debian 处理它的方式破坏了它

你是说在 Python 3.5 升级到 Python 3.6 之后,那个python3符号链接没有更新? 如果您观察到的确实是 Debian 或 Ubuntu 的错误,其中 Python 升级未能设置正确的符号链接,那么该错误可能应该在上游解决,不是吗?

我意识到问题已经解决,但我发帖希望这可能有助于避免修改 PATH。 我今天在设置新的 Ubuntu 18.04 机器时遇到了这个问题,并且能够在没有 PATH 修改的情况下解决它,尽管我确实重新启动了(我相当确定注销/登录会起作用,但没有验证)。

通过python3-pip安装 pip3 并使用pip3 install --user pipenv安装 pipenv 后,我收到了主题错误。 当我在~/.profile (股票,我没有修改)中注意到以下内容时,我正准备使用@slhck的解决方法:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

好奇,我重新启动,果然,问题解决了,因为我的.local/bin现在位于我的 PATH 的开头并且 pip3 再次工作。

它对我有用,重新启动后一切正常。 (安装后:“pip3 install --user pipenv”重启你的系统,它就会工作。

此页面是否有帮助?
0 / 5 - 0 等级