一尘不染

来自pip import main的<module>中文件“ / usr / bin / pip”,第9行,ImportError:无法导入名称main

flask

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

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


阅读 387

收藏
2020-04-06

共1个答案

一尘不染

TL; DR
1. 理想的解决方案(Ubuntu / Debian方式):
$ python -m pip uninstall pip 卸载新的pip 10并保留Ubuntu / Debian提供的补丁pip8。要在系统范围内安装模块,请apt尽可能使用(除非你在virtualenv中),更多在下面。在较旧的Ubuntu / Debian版本中,–user在virtualenvs之外使用pip时,请始终添加标记(~/.local/自2016年以来,默认安装在python-pip和python3-pip中)。

  1. 如果你仍然想单独使用新的pip 10,可以使用3种快速解决方法:

  2. 只需重新打开一个新的bash会话(一个新的终端选项卡,或键入bash)-pip 10可用(请参阅参考资料pip -V)。debian的pip 8仍然安装但已损坏;要么

  3. $ hash -d pip && pip -V 刷新$ PATH中的pip路径名。debian的pip 8仍然安装但已损坏;要么
  4. $ sudo apt remove python-pip && hash -d pip (对于Python 3是python3-pip)-完全卸载debian的pip 8,以使用新的pip 10。
    注意:--user除非你处于virtualenv中,否则你将始终需要将标记添加到非debian提供的pip 10中!Ubuntu / Debian并不真正支持你在virtualenv之外使用系统范围内的pip 10。从不sudo pip

因此,在这里,我们在Ubuntu 16.04 ec2计算机中安装了Python 2.7.12,并且在尝试使用pip时得到ImportError:无法导入名称main。这是由以下命令引起的:它安装了最新的pip版本10以及OS发行版中的python-pip debian软件包的Ubuntu默认pip版本(系统Python安装),完全绕开了Ubuntu 子系统。它破坏了Ubuntu的默认pip:来自python-pip(系统安装到/ usr / bin / pip *)的debian修补启动器脚本试图从新安装的pip 10库中导入main(),但使用不同的导入路径,因此失败。pip install –upgrade pipapt

在pip问题跟踪程序的开发人员线程中将更详细地讨论此错误,包括一些建议的解决方案,例如:

  • $ hash -d pip命令:当hash被调用时,PIP的完整路径是由$ PATH搜索的目录和记忆确定。任何先前记住的路径名都将被丢弃。该-d选项使外壳“忘记”给定包名称的记住位置;要么

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

  • 你可以仅使用版本控制的pip2命令(或pip3针对Python 3)而不是pip调用较早的系统安装的启动器/usr/bin/pip2,而$HOME/.local/bindir中的任何pip脚本(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外部需要此开关。

  • 或者,卸载一个两个点子- 无论是用户安装或系统安装 -来解决冲突:
    $ python -m pip uninstall pip-删除你手动安装的点子有利于从python-PIP Debian软件包以前安装的Ubuntu的版本运(python3- pip for Python 3); 它稍旧一些,但是它可以从PyPI找到并安装最新的模块,并且默认情况下在$ PATH中有一个有效的pip命令;或
    $ sudo apt-get remove python-pip–卸载Ubuntu提供的pip,以使用最新的pip 10;如果无法通过short pip命令访问它,只需将$HOME/.local/bin目录添加到$ PATH环境变量中以使用pip命令(请参见上文)。
    注意:Ubuntu 16.04 pip v8.1.1和最新的pip v10.0.1产生完全相同的PyPI索引搜索结果,并且可以提取相同的模块版本;

  • 最后,你可以完全忽略这两个点,而支持APT,而在Ubuntu仓库中使用以下命令在系统范围内安装Python软件包:
    $ apt search <python-package> #或apt-cache search在较旧的Ubuntu
    $ apt show <python-package> #例如python-flask
    $ sudo apt install <python-package> #或sudo apt-get install
    前缀python-为Python 2的软件包;与python3-一起用于Python3。
    你可能需要标准的apt-get安装方法。例如,在你的情况下:
    python-mysqldb-MySQL的Python接口<-MySQLdb的分支==MySQL-python python-flask-sqlalchemy -SQL Alchemy支持
    python-pymysql-纯Python MySQL驱动程序
    实际上,只要有可能,尤其是在以下情况下,最好使用 Ubuntu存储库中的python-packages 严重的系统依赖性或在系统范围内使用时。当然,与PyPI(只有一个版本)相比,Ubuntu存储库中的Python软件包数量(几千个!)相对较少,因为任何OS存储库都略微落后于PyPI版本。但是APT的好处是,所有Ubuntu提供的软件包都已在Ubuntu中进行了集成测试,加上apt-get可以快速解决诸如C扩展之类的繁重依赖项。作为apt安装的一部分,你将始终获得所需的系统库,但是使用pip则无法保证。
    但是,如果你确实只需要最新(或某些较旧)的软件包版本,或者只能在PyPI上找到它,或者需要隔离模块,则APT可能不是一个选择。那么pip确实是更合适的工具。如果必须使用pip installUbuntu上使用而不是的命令apt-get install,请确保它在隔离的虚拟开发环境中运行,例如在virtualenv(sudo apt-get install python-virtualenv)或使用内置venv模块(仅在python3中可用)或在每个用户级别(pip install --user命令选项)运行,但不是系统范围的(从不sudo pip!)。

注意:sudo pip应避免在Ubuntu / Debian上使用命令(具有root用户访问权限),因为它会干扰系统软件包管理器(apt)的操作,并且在意外升级系统使用的python模块时,可能会影响Ubuntu OS 组件,尤其是通过依赖另一个pip包。建议不要使用Pip更改系统范围的Python软件包,因为这些软件包由Ubuntu上的apt-get管理。

2020-04-06