文件“/usr/bin/pip”,第9行,在<module>from pip import main importeror中:无法导入名称main

2024-04-25 23:00:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here

我在ec2 Linux AWS上做这个。


Tags: aws数据库网页flasklinux错误mysqlec2
3条回答

TL;博士

  1. “理想”解决方案(Ubuntu/Debian方式):
    $ python -m pip uninstall pip卸载新的pip 10并保留Ubuntu/Debian提供的修补pip 8。对于系统范围内的模块安装,尽可能使用apt(除非您在virtualenv中),下面将详细介绍。在较旧的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 && pip -V刷新$PATH中的pip路径名。debian的pip 8仍然安装,但已损坏;或
    • $ sudo apt remove python-pip && hash -d pip(对于python3,它是python3 pip)--完全卸载debian的pip 8,以支持新的pip 10。

注意:您将始终需要向非debian提供的pip 10添加--user标志,除非您在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.04ec2 machine中有Python 2.7.12,在尝试使用pip时得到importorror:cannot import name main。这是由pip install --upgrade pip命令引起的:它安装了最新的pip版本10和来自OS发行版python pip debian包(系统python安装)的Ubuntu默认pip版本,完全绕过了Ubuntu apt子系统。它打破了Ubuntu的默认pip:来自python pip的debian补丁启动程序脚本(系统安装到/usr/bin/pip*)试图从新安装的pip 10库中执行import main(),但导入路径不同,因此失败。

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

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

  • 类似地,您只需重新打开一个新的bash会话(一个新的终端选项卡)即可刷新$PATH中的pip路径名;或者

  • 您可以只使用版本化的pip2命令(或者Python 3的pip3)而不是pip来调用旧的系统安装的启动程序/usr/bin/pip2,而位于$HOME/.local/bin目录(pip,pip2,pip2.7)中的任何pip脚本都将调用新的用户安装的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,以支持python pip debian包(python3pip用于python3)中先前安装的Ubuntu附带版本;它稍旧一些,但它可以很好地查找和安装PyPI中的最新模块,并且默认情况下在$PATH中有一个工作的pip命令;或者
    $ sudo apt-get remove python-pip要卸载Ubuntu提供的pip以支持最新的pip 10;如果无法通过shortpip命令访问它,只需将$HOME/.local/bin目录添加到$PATH enviro使用pip命令的政府变量(见上文)。
    注意:Ubuntu 16.04 pip v8.1.1和最新的pip v10.0.1会产生完全相同的PyPI索引搜索结果,并且可以提取相同的模块版本;

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

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

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

我的系统是一个Linux Ubuntu发行版,我执行了以下命令:

python -m pip uninstall pip

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

我已经有了一个更老的pip/pip2系统可执行文件(古代安装的apt-get),工作起来很有魅力。

这些步骤对我有效。

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包了。

相关问题 更多 >