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

时间:2018-04-22 08:42:37

标签: python flask pip

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

enter image description here

我在ec2 Linux AWS上这样做。

7 个答案:

答案 0 :(得分:61)

TL; DR

  1. &#39;理想&#39;解决方案(Ubuntu / Debian方式):
    $ python -m pip uninstall pip卸载新的pip 10并保留你的Ubuntu / Debian提供的补丁点。对于系统范围的模块安装,尽可能使用apt(除非你是在virtualenv),更多关于它。在较旧的Ubuntu / Debian版本中,在virtualenvs之外使用pip时总是添加--user标志(安装到~/.local/,默认在python-pip和python3-pip自2016年起)。

  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(对于Python 3,它的python3-pip) - 完全卸载debian的pip 8,支持你的新点10。
  3. 注意:除非你是在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忘记&#34;记住给定包名称的位置;或

    • 同样,你可以简单地重新打开一个新的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命令,请确保它在隔离的虚拟开发环境中运行,例如使用virtualenvsudo 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寻求帮助,