答案 0 :(得分:61)
'理想'解决方案(Ubuntu / Debian方式):
$ python -m pip uninstall pip
卸载新的pip 10并保留你的Ubuntu / Debian提供的补丁点。对于系统范围的模块安装,尽可能使用apt
(除非你是在virtualenv),更多关于它。在较旧的Ubuntu / Debian版本中,在virtualenvs之外使用pip时总是添加--user
标志(安装到~/.local/
,默认在python-pip和python3-pip自2016年起)。
如果仍然想要专门使用新的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
(对于Python 3,它的python3-pip) - 完全卸载debian的pip 8,支持你的新点10。 注意:除非你是在virtualenv中,否则你总是需要向非debian提供的pip 10添加--user
标志! 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:无法导入名称主使用点子。它是由pip install --upgrade pip
命令引起的:安装最新的pip版本10以及来自OS发行版(系统Python安装)的python-pip debian软件包的Ubuntu默认pip版本,完全绕过Ubuntu apt
子系统。它打破了Ubuntu的默认点:从python-pip(系统安装到/ usr / bin / pip *)的debian-patched启动器脚本尝试从你新安装的pip 10库中导入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
dir(pip,pip2,pip2.7)的任何pip脚本都将调用新的用户安装的pip 10版本;
您还可以将版本化的Python命令与-m
开关结合使用来运行相应的pip副本,例如:
$ python2 -m pip install --user SomePackage
#default Python 2
$ python2.7 -m pip install --user SomePackage
#具体是Python 2.7
如果您有多个版本的Python并且需要来自PyPI的扩展(例如MySQL-python模块(MySQLdb)或Flask-MySQL),那么这对于特定的Python版本来说非常方便。仅在virtualenv之外才需要--user
开关。
或者,卸载两个点的一个 - either user-installed or system-installed - 以解决冲突:
$ python -m pip uninstall pip
- 从python-pip debian软件包(python3-pip for Python 3)中删除你手动安装的pip,转而支持以前安装的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 repo安装Python软件包:
旧版Ubuntu中的$ apt search <python-package>
#或apt-cache search
$ apt show <python-package>
#例如蟒蛇瓶
$ sudo apt install <python-package>
#或sudo apt-get install
带有python-
前缀的软件包适用于Python 2; python3-
用于Python 3
标准的apt-get安装方法可能就是您所需要的。例如,在您的情况下:
python-mysqldb
- MySQL的Python接口&lt; - MySQLdb的分支== MySQL-python
python-flask-sqlalchemy
- SQL Alchemy支持
python-pymysql
- 纯Python MySQL驱动程序
实际上,只要有可能,来自Ubuntu存储库的python-packages就是preferred,特别是在系统依赖性很大或使用system-wide的情况下。
当然,与PyPI(并且只有一个版本)相比,Ubuntu存储库中的Python包数量(数千!)相对较小,因为任何操作系统存储库都略微落后于PyPI版本。但是APT的优势在于所有Ubuntu提供的软件包都在Ubuntu中进行了集成测试,而且apt-get可以自动快速解决C扩展等重度依赖。作为apt安装的一部分,您将始终获得所需的系统库,但是使用pip,您有no such guarantees
但是,APT可能不是一个选项,如果您确实只需要最新的(或某些较旧的)软件包版本,或者只能在PyPI上找到它,或者需要隔离模块时;那么pip确实是比较合适的工具。如果必须在Ubuntu而不是pip install
上使用apt-get install
命令,请确保它在隔离的虚拟开发环境中运行,例如使用virtualenv(sudo apt-get install python-virtualenv
)或使用一个内置的venv
模块(仅在python3中可用),或者在每个用户级别(pip install --user
命令选项),但不是系统范围(从不{{ 1}}!)。
注意:应该避免在Ubuntu / Debian上使用sudo pip
命令(具有root访问权限),因为interferes具有系统包管理器(apt)的操作当系统使用的python模块意外升级时,尤其是依赖于另一个pip包时,可能会影响Ubuntu OS components。建议永远不要使用Pip来更改系统范围的Python包,因为这些包由Ubuntu上的apt-get管理。
答案 1 :(得分:22)
这些步骤对我有用。
1 - 从python卸载pip更新。
2 - 从Ubuntu卸载pip包。
3 - 检查系统中的点差二进制文件不再存在。
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包了。
答案 2 :(得分:4)
我的分,我有相同的public static async System.Threading.Tasks.Task<bool> AuthUserAsync(string Email, string Password)
{
using (var db = new AntContext())
{
string hashedPW = GetHash(Password);
bool userValid = db.Users.Any(user => user.Email == Email && user.Password == hashedPW);
if (userValid)
{
var actUser = db.Users.FirstOrDefault(u => u.Email == Email && u.Password == hashedPW);
if (actUser != null && !actUser.IsLocked)
{
/** What do I do here? **/
}
else if (actUser.IsLocked)
{
LoggingServices.AuthLog(actUser.Email, "Hat versucht auf ein gesperrtes Konto zuzugreifen.");
}
}
return false;
}
}
。
我的系统是 Linux Ubuntu 发行版,我已经执行了以下命令:
$(document).ready(function() {
$("[name=checkboxa]").change(function() {
let selectedValA = $(this).val();
let isAChecked = $(this).prop("checked");
$(`[name=checkboxb][value="${selectedValA}"]`).prop("checked", isAChecked);
});
});
});
这已删除一个本地(对于用户)ImportError: cannot import name main
版本。
我已经有一个老版本的python -m pip uninstall pip
/ pip
系统可执行文件(很早就安装了pip
),它像一种魅力。
答案 3 :(得分:2)
As suggested in pip's github issue
临时解决方法是-
编辑您的/usr/bin/pip
文件并注释导入main的行并对其进行编辑
#from pip import main
from pip._internal import main as main
非常适合我。 注意-这是一个临时修复程序。等待团队点修正此问题。
OR
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 :(得分:0)
尝试
检查您使用的 python版本
# Python --version
并尝试安装,例如,如果您的版本是2.7
#python2.7 <package name>
会很好的工作...
答案 5 :(得分:0)
pip 19升级后,我也遇到了类似的问题。因此,我执行以下操作来解决此问题。
pip安装--upgrade pip == 9.0.3
代替
点安装-U点
答案 6 :(得分:-1)
sudo easy_install MySQL-python 可以提供帮助或尝试;
sudo yum install mysql-devel python-devel MySQL-python
检查this tutorial寻求帮助,