2024-04-25 23:00:31 发布
网友
我正在尝试使用python flask运行一个网页,并将其连接到MySQL的数据库,在安装MySQL包时,我收到了这个错误。
我在ec2 Linux AWS上做这个。
“理想”解决方案(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中默认)。
$ python -m pip uninstall pip
apt
--user
~/.local/
如果您仍想独占使用新的pip 10,有3个快速解决方法:
bash
pip -V
$ hash -d pip && pip -V
$ sudo apt remove python-pip && hash -d pip
注意:您将始终需要向非debian提供的pip 10添加--user标志,除非您在virtualenv中!Ubuntu/Debian并不真正支持在virtualenv之外的系统范围内使用pip 10。永远不要sudo pip!
sudo pip
详细信息:https://github.com/pypa/pip/issues/5221#issuecomment-382069604https://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 install --upgrade pip
pip问题跟踪程序的developer thread中更详细地讨论了这个错误,包括一些建议的解决方案,例如:
$ hash -d pip命令:当调用hash时,通过搜索$PATH中的目录并记住pip的完整路径名。任何以前记住的路径名都将被丢弃。-d选项导致shell“忘记”给定包名的记住位置;或
$ hash -d pip
hash
-d
类似地,您只需重新打开一个新的bash会话(一个新的终端选项卡)即可刷新$PATH中的pip路径名;或者
您可以只使用版本化的pip2命令(或者Python 3的pip3)而不是pip来调用旧的系统安装的启动程序/usr/bin/pip2,而位于$HOME/.local/bin目录(pip,pip2,pip2.7)中的任何pip脚本都将调用新的用户安装的pip 10版本;
pip2
pip3
pip
/usr/bin/pip2
$HOME/.local/bin
还可以将版本化的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外部需要。
-m
$ python2 -m pip install --user SomePackage
$ python2.7 -m pip install --user SomePackage
或者,卸载两个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索引搜索结果,并且可以提取相同的模块版本;
$ sudo apt-get remove python-pip
最后,您可以完全忽略这两个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 Pythonpython-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,请确保它在一个独立的虚拟开发环境中运行,比如使用virtualenv(sudo apt-get install python-virtualenv),或者使用内置的venv模块(仅在python3中可用),或者在每个用户级别(pip install --user命令选项),但是系统范围内不使用(永远不要使用sudo pip!)。
$ apt search <python-package>
apt-cache search
$ apt show <python-package>
$ sudo apt install <python-package>
sudo apt-get install
python-
python3-
python-mysqldb
python-flask-sqlalchemy
python-pymysql
pip install
apt-get install
sudo apt-get install python-virtualenv
venv
pip install --user
注意:应该避免在Ubuntu/Debian上使用sudo pip命令(具有根访问权限),因为它interferes具有系统包管理器(apt)的操作,并且当系统使用的python模块意外升级时,可能会影响Ubuntu OScomponents,特别是依赖于另一个pip包。建议不要使用Pip来更改系统范围的Python包,因为这些包是由apt get on Ubuntu管理的。
我的分,我有同样的ImportError: cannot import name main。
ImportError: cannot import name main
我的系统是一个Linux Ubuntu发行版,我执行了以下命令:
python -m pip uninstall pip
这已经删除了一个本地(对于用户)pip版本。
我已经有了一个更老的pip/pip2系统可执行文件(古代安装的apt-get),工作起来很有魅力。
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包了。
TL;博士
“理想”解决方案(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中默认)。如果您仍想独占使用新的pip 10,有3个快速解决方法:
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版本,完全绕过了Ubuntuapt
子系统。它打破了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 Pythonpython-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
,请确保它在一个独立的虚拟开发环境中运行,比如使用virtualenv(sudo 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发行版,我执行了以下命令:
这已经删除了一个本地(对于用户)
pip
版本。我已经有了一个更老的
pip
/pip2
系统可执行文件(古代安装的apt-get
),工作起来很有魅力。这些步骤对我有效。
1-从python卸载pip更新。
2-从您的Ubuntu卸载pip包。
3-检查系统中是否不再存在pip二进制文件。
4-下载并安装pip。(credits for VanDragt.com)
现在你应该可以安装任何你想要的pip包了。
相关问题 更多 >
编程相关推荐