【问题标题】:File "/usr/bin/pip", line 9, in <module> from pip import main ImportError: cannot import name main文件“/usr/bin/pip”,第 9 行,在 <module> from pip import main ImportError: cannot import name main
【发布时间】:2018-10-02 11:54:42
【问题描述】:

我正在尝试使用 python flask 运行网页并将其与 MySQL 数据库连接,并且在安装 MySQL 包时收到此错误。

我在 ec2 Linux AWS 上执行此操作。

【问题讨论】:

标签: python flask pip


【解决方案1】:

pip 19 升级后我遇到了类似的问题。所以我做了以下来解决这个问题。

pip install --upgrade pip==9.0.3

而不是

pip install -U pip

【讨论】:

    【解决方案2】:

    我的分,我有同样的ImportError: cannot import name main

    我的系统是一个Linux Ubuntu发行版,我已经执行了这个命令:

    python -m pip uninstall pip
    

    这已经删除了一个本地(为用户)pip 版本。

    我已经有一个旧的pip/pip2 系统可执行文件(apt-get 安装在古代),就像一个魅力。

    【讨论】:

    • 这节省了我的时间 +1
    【解决方案3】:

    As suggested in pip's github issue

    临时修复是 -

    编辑您的 /usr/bin/pip 文件并注释导入 main 的行并编辑它

    #from pip import main
    from pip._internal import main as main
    

    非常适合我。 注意 - 这是一个临时修复。等待团队 pip 解决此问题。

    from pip import main
    if __name__ == '__main__':
        sys.exit(main())
    

    到这里:

    from pip import __main__
    if __name__ == '__main__':
        sys.exit(__main__._main())
    

    正如this SO answer 中所建议的那样。

    【讨论】:

      【解决方案4】:

      试试这个

      检查你使用的python版本

      # Python --version
      

      并尝试安装 例如,如果您的版本是 2.7

      #python2.7 <package name> 
      

      会正常工作......

      【讨论】:

      • 你用过 pip 吗? python2.7 &lt;package name&gt; 这适用于哪个世界?
      【解决方案5】:

      这些步骤对我有用。

      1- 从 python 中卸载 pip 更新。
      2- 从 Ubuntu 中卸载 pip 包。
      3-检查您的系统中是否不再存在 pip 二进制文件。

      python -m pip uninstall pip
      apt remove python-pip
      whereis pip
      

      4- 下载并安装 pip。 (credits for VanDragt.com)

      wget https://bootstrap.pypa.io/get-pip.py -O /tmp/get-pip.py
      sudo python3 /tmp/get-pip.py
      pip install --user pipenv
      pip3 install --user pipenv
      echo "PATH=$HOME/.local/bin:$PATH" >> ~/.profile
      source ~/.profile
      whereis pip
      

      现在你应该可以安装任何你想要的 pip 包了。

      【讨论】:

        【解决方案6】:

        TL;DR

        1. “理想”解决方案(Ubuntu/Debian 方式):
          $ python -m pip uninstall pip 卸载新的 pip 10 并保留 Ubuntu/Debian 提供的修补过的 pip 8。对于 系统范围 尽可能使用apt 安装模块(除非您在虚拟环境中),下面会详细介绍。在较旧的 Ubuntu/Debian 版本中,在 virtualenvs 之外使用 pip 时始终添加 --user 标志(安装到 ~/.local/,自 2016 年以来默认在 python-pip 和 python3-pip 中)。

        2. 如果您想独占使用新的 pip 10,有 3 个快速解决方法:

          • 只需重新打开一个新的 bash 会话(一个新的终端选项卡,或键入 bash) - 并且 pip 10 变为可用(请参阅 pip -V)。 debian 的 pip 8 仍然安装但已损坏;或
          • $ hash -d pip &amp;&amp; pip -V 刷新 $PATH 中的 pip 路径名。 debian 的 pip 8 仍然安装但已损坏;或
          • $ sudo apt remove python-pip &amp;&amp; hash -d pip(对于 Python 3,它是 python3-pip)——完全卸载 debian 的 pip 8,转而使用新的 pip 10。

        注意:您总是需要将--user 标志添加到非debian 提供的pip 10,除非您在virtualenv 中! Ubuntu/Debian 并不真正支持您在 virtualenv 之外的系统范围内使用 pip 10。永远不要sudo pip

        详情:
        https://github.com/pypa/pip/issues/5221#issuecomment-382069604
        https://github.com/pypa/pip/issues/5240#issuecomment-381673100


        所以,这里我们在 Ubuntu 16.04 ec2 机器中有 Python 2.7.12,并在尝试执行时得到 ImportError: cannot import name main使用点子。这是由pip install --upgrade pip 命令引起的:它将最新的 pip 版本 10 与来自 OS 发行版(系统 Python 安装)的 python-pip debian 包的 Ubuntu 默认 pip 版本一起安装,完全绕过了 Ubuntu apt 子系统。它破坏了 Ubuntu 的默认 pip:来自 python-pip 的 debian-patched 启动器脚本(系统安装到 /usr/bin/pip*)尝试从新安装的 pip 10 库中导入 main(),但导入不同路径,所以它失败了。

        在 pip 问题跟踪器的 developer thread 中更详细地讨论了此错误,包括一些建议的解决方案,例如:

        • $ hash -d pip 命令:当调用hash 时,pip 的完整路径名通过搜索 $PATH 中的目录确定并记住。任何先前记住的路径名都将被丢弃。 -d 选项使 shell “忘记”给定包名的记忆位置;或

        • 同样,您可以简单地重新打开一个新的 bash 会话(一个新的终端选项卡)来刷新 $PATH 中的 pip 路径名;或

        • 您可以只使用版本化的pip2 命令(或pip3 用于Python 3)而不是pip 来调用旧的系统安装启动器/usr/bin/pip2,而位于@987654350 中的任何pip 脚本@dir (pip, pip2, pip2.7) 将调用您新安装的用户安装的 pip 10 版本;

        • 您还可以将版本化的 Python 命令与-m 开关结合使用来运行相应的 pip 副本,例如:
          $ python2 -m pip install --user SomePackage # 默认 Python 2
          $ python2.7 -m pip install --user SomePackage #特别是 Python 2.7
          如果您有多个版本的 Python 并且需要 PyPI 的扩展,例如您的 MySQL-python 模块 (MySQLdb) 或 Flask-MySQL,这将很方便,以用于特定的 Python 版本。 --user 开关仅在 virtualenv 之外需要。

        • 或者,卸载两个 pip 中的 一个 - either user-installed or system-installed - 以解决冲突:
          $ python -m pip uninstall pip - 删除您手动安装的 pip 以支持以前的 pip从 python-pip debian 包(python3-pip for Python 3)安装了 Ubuntu 提供的版本;它稍微旧一点,但它可以很好地找到并安装来自 PyPI 的最新模块,并且默认情况下在 $PATH 中有一个有效的 pip 命令;或
          $ sudo apt-get remove python-pip – 卸载 Ubuntu 提供的 pip 以使用最新的 pip 10;如果无法通过简短的 pip 命令访问它,只需将 $HOME/.local/bin 目录添加到 $PATH 环境变量即可使用 pip 命令(见上文)。
          注意: Ubuntu 16.04 pip v8.1.1 和最新的 pip v10.0.1 产生完全相同的 PyPI 索引搜索结果,并且可以拉取相同的模块版本;

        • 最后,您可以完全忽略这两个点以支持 APT,并从 Ubuntu 存储库安装 Python 包系统范围:
          $ apt search &lt;python-package&gt; # 或 apt-cache search 在旧版 Ubuntu
          @987654362 @#例如python-flask
          $ sudo apt install &lt;python-package&gt;# 或sudo apt-get install
          python- 为前缀的包适用于 Python 2; python3- 用于 Python 3。
          标准的 apt-get 安装方法可能是您需要的。例如,在您的情况下:
          python-mysqldb - MySQL 的 Python 接口 MySQL-python
          python-flask-sqlalchemy - SQL Alchemy 支持
          @ 987654369@ - 纯 Python MySQL 驱动程序
          事实上,Ubuntu 存储库中的 python-packages 尽可能是preferred,特别是在系统依赖严重的情况下或使用system-wide 时。 当然,Ubuntu 存储库中的 Python 包数量(几千个!)与 PyPI 相比(并且只有一个版本)相对较少,因为任何操作系统存储库都略微落后于 PyPI 版本。但是 APT 的好处是所有 Ubuntu 提供的软件包都在 Ubuntu 中进行了集成测试,而且 apt-get 可以快速自动解决 C 扩展等重度依赖项。作为 apt 安装的一部分,您将始终获得所需的系统库,但使用 pip,您将拥有 no such guarantees
          但是,如果您真的只需要最新(或某些较旧)的包版本,或者只能在 PyPI 中找到它,或者需要隔离模块时,APT 可能不是一个选项;那么 pip 确实是更合适的工具。如果您必须在 Ubuntu 上使用 pip install 命令而不是 apt-get install,请确保它在隔离的虚拟开发环境中运行,例如使用 virtualenv (sudo apt-get install python-virtualenv),或使用内置的 venv 模块(仅在 python3 中可用),或在每个用户级别(pip install --user 命令选项),但不是 系统范围的(从不sudo pip!)。

        注意: 应避免在 Ubuntu/Debian 上使用 sudo pip 命令(具有 root 访问权限),因为它 interferes 与系统包管理器(apt)的操作有关,可能会影响 Ubuntu OS components 当系统使用的 python 模块意外升级时,特别是依赖于另一个 pip 包。建议不要使用 Pip 来更改系统范围的 Python 包,因为这些包在 Ubuntu 上由 apt-get 管理。

        【讨论】:

        • 这是正确答案,不仅解释了根本原因,还提供了所有可用的选项(主要是:恢复到 Debian/Ubuntu 提供的旧 pip 8,或者继续使用 pip 10 但带有 - -用户每次切换)。很好的答案!
        • 赞成 sudo pip 的完整性和警告。很好的答案:)
        猜你喜欢
        • 2019-01-06
        • 2022-09-28
        • 2022-12-02
        • 2018-10-02
        • 2019-07-20
        • 2020-07-16
        • 2019-06-10
        • 2014-09-25
        相关资源
        最近更新 更多