web-dev-qa-db-ger.com

Datei "/ usr/bin/pip", Zeile 9, in <module> aus pip import main ImportError: Name main kann nicht importiert werden

Ich versuche, eine Webseite mit einer Python-Flasche zu starten und sie mit der Datenbank von MySQL zu verbinden. Während der Installation von MySQL-Paketen erhalte ich diesen Fehler. 

 enter image description here

Ich mache dies auf ec2 Linux AWS.

24
Tanisha Bansal

TL; DR

  1. Die "ideale" Lösung (Ubuntu/Debian-Methode):
    $ python -m pip uninstall pip, Um den neuen pip 10 zu deinstallieren und den von Ubuntu/Debian bereitgestellten gepatchten pip 8 beizubehalten. Für eine systemweite Installation von Modulen verwenden Sie apt wo immer möglich (es sei denn, Sie befinden sich in einer virtuellen Umgebung), mehr dazu weiter unten. Fügen Sie in älteren Ubuntu/Debian-Versionen immer das Flag --user Hinzu, wenn Sie pip außerhalb von virtualenvs verwenden (installiert in ~/.local/, Standard in python-pip und python3-pip seit 2016).

  2. Wenn Sie still ausschließlich den neuen pip 10 verwenden möchten, gibt es 3 schnelle Problemumgehungen:

    • öffnen Sie einfach eine neue Bash-Sitzung (ein neues Terminal-Register oder geben Sie bash ein) - und Pip 10 wird verfügbar (siehe pip -V). debians pip 8 bleibt installiert, ist aber defekt; oder
    • $ hash -d pip && pip -V, Um den Pip-Pfadnamen in $ PATH zu aktualisieren. debians pip 8 bleibt installiert, ist aber defekt; oder
    • $ Sudo apt remove python-pip && hash -d pip (Für Python 3 ist es python3-pip) - um debians pip 8 vollständig zu deinstallieren, zugunsten Ihres neuen pip 10.

Hinweis: Sie müssen immer das Flag --user Zu Pip 10, das nicht von Debian bereitgestellt wird, hinzufügen, es sei denn, Sie befinden sich in einer virtuellen Umgebung! Ihre Verwendung von pip 10 im gesamten System außerhalb von virtualenv wird von Ubuntu/Debian nicht wirklich unterstützt. Niemals Sudo pip!

Einzelheiten:
https://github.com/pypa/pip/issues/5221#issuecomment-382069604
https://github.com/pypa/pip/issues/5240#issuecomment-3816731


Hier haben wir also Python 2.7.12 in Ubuntu 16.04 ec2-Maschine , und get ImportError: Der Name main kann bei Verwendung von pip nicht importiert werden. Dies wird durch den Befehl pip install --upgrade pip Verursacht: Dieser Befehl installiert die neueste pip-Version 10 zusammen mit Ubuntus Standard-pip-Version aus dem Debian-Paket python-pip aus der Betriebssystem-Distribution (das System Python Installation)) vollständig Das Ubuntu-Subsystem apt wird umgangen. Es bricht den Ubuntu-Standard-Pip: Das mit Debian-Patches versehene Launcher-Skript von Python-Pip (vom System nach/usr/bin/pip * installiert) versucht, main () von Ihrem neuen zu importieren Installierte Pip 10-Bibliothek, aber mit einem anderen Importpfad, so dass es fehlschlägt.

Dieser Fehler wird in einem Entwicklerthread des Pip Issue Trackers näher erläutert, einschließlich einiger vorgeschlagener Lösungen , wie z :

  • Der Befehl $ hash -d pip: Wenn hash aufgerufen wird, wird der vollständige Pfadname von pip durch Durchsuchen der Verzeichnisse in $ PATH ermittelt und gespeichert. Jeder zuvor gespeicherte Pfadname wird verworfen. Die Option -d Bewirkt, dass die Shell den gespeicherten Speicherort des angegebenen Paketnamens "vergisst". oder

  • Ebenso können Sie einfach eine neue Bash-Sitzung (eine neue Terminal-Registerkarte) erneut öffnen, um den Pip-Pfadnamen in $ PATH zu aktualisieren. oder

  • Sie können einfach einen versionierten pip2 - Befehl (oder pip3 Für Python 3)) anstelle von pip verwenden, um den älteren vom System installierten Launcher aufzurufen /usr/bin/pip2, Während jedes Pip-Skript in $HOME/.local/bin Dir (pip, pip2, pip2.7) Ihre neue vom Benutzer installierte pip 10-Version aufruft;

  • Sie können auch die versionierten Befehle Python in Kombination mit dem Schalter -m Verwenden, um die entsprechende Kopie von pip auszuführen. Beispiel:
    $ python2 -m pip install --user SomePackage # Default Python 2
    $ python2.7 -m pip install --user SomePackage # Spezifisch Python 2.7
    Das ist praktisch, wenn Sie mehrere Versionen von Python= und eine Erweiterung von PyPI benötigen, z. B. Ihr MySQL-Python-Modul (MySQLdb) oder ein Flask-MySQL für eine bestimmte Python version. Der Schalter --user Wird nur außerhalb von virtualenv benötigt.

  • Oder deinstallieren Sie einen der beiden Pips - entweder vom Benutzer oder vom System installiert -, um den Konflikt zu lösen:
    $ python -m pip uninstall pip - um Ihre manuell installierte Pip zugunsten der zuvor installierten Ubuntu-Version aus dem Debian-Paket python-pip zu entfernen (python3-pip für Python 3) Es ist etwas älter, aber es findet und installiert die neuesten Module von PyPI, und es verfügt standardmäßig über einen funktionierenden Pip-Befehl in $ PATH
    $ Sudo apt-get remove python-pip - um den von Ubuntu bereitgestellten pip zugunsten Ihres neuesten pip 10 zu deinstallieren; Wenn der Zugriff über den kurzen Befehl pip nicht möglich ist, fügen Sie einfach Ihr Verzeichnis $HOME/.local/bin zu Ihrer Umgebungsvariablen $ PATH hinzu, um den Befehl pip zu verwenden (siehe oben).
    Hinweis: Ubuntu 16.04 pip v8.1.1 und der neueste pip v10.0.1 erzeugen genau die gleichen PyPI-Index-Suchergebnisse und können die ziehen gleiche Modulversionen;

  • Schließlich könnten Sie beide Pips insgesamt zugunsten von APT ignorieren und systemweit Python -Pakete von Ubuntu repo installieren mit:
    $ apt search <python-package> # Oder apt-cache search In älteren Ubuntu
    $ apt show <python-package> # Z. Python-Flasche
    $ Sudo apt install <python-package> # Oder Sudo apt-get install
    Pakete mit dem Präfix python- Sind für Python 2; mit python3- Sind für Python 3.
    Die Standardmethode für die Installation von apt-get ist möglicherweise genau das, was Sie benötigen. Zum Beispiel in Ihrem Fall:
    python-mysqldb - Python Schnittstelle zu MySQL <- eine Abzweigung von MySQLdb == MySQL-Python
    python-flask-sqlalchemy - SQL Alchemy-Unterstützung
    python-pymysql - reiner Python MySQL-Treiber
    Tatsächlich sind Python-Pakete aus dem Ubuntu-Repository bevorzugt , wann immer dies möglich ist, insbesondere bei starken Systemabhängigkeiten oder bei Verwendung systemweit . Natürlich ist die Anzahl der Python -Pakete im Ubuntu-Repository (wenige Tausend!) Im Vergleich zu PyPI relativ gering (und es gibt nur eine Version davon), da jedes Betriebssystem-Repository etwas hinter PyPI zurückbleibt Die Vorteile von APT sind, dass alle von Ubuntu bereitgestellten Pakete in Ubuntu Integrationstests unterzogen wurden und apt-get starke Abhängigkeiten wie C-Erweiterungen automatisch schnell auflöst. Sie erhalten immer die Systembibliotheken du brauchst als teil der apt install, aber mit pip hast du keine solchen garantien .
    APT ist jedoch möglicherweise keine Option, wenn Sie wirklich nur die neueste (oder bestimmte ältere) Paketversion benötigen oder diese nur bei PyPI zu finden ist oder wenn Module isoliert werden müssen. dann ist pip ja passenderes werkzeug. Wenn Sie unter Ubuntu den Befehl pip install Anstelle von apt-get install Verwenden müssen, stellen Sie sicher, dass er in einer isolierten virtuellen Entwicklungsumgebung ausgeführt wird, z. B. mit virtualenv (Sudo apt-get install python-virtualenv) oder mit einem integrierten venv -Modul (nur in python3 verfügbar) oder auf Benutzerebene (Befehlsoption pip install --user), aber not systemweit (niemals Sudo pip!).

Hinweis: Die Verwendung des Befehls Sudo pip (Mit Root-Zugriff) unter Ubuntu/Debian sollte vermieden werden, da dies stört = mit dem Betrieb des System Package Managers (apt) und kann Ubuntu OS betreffen Komponenten wenn ein vom System verwendetes python Modul unerwartet aktualisiert wird, insbesondere durch Abhängigkeiten von einem anderen pip package: Es wird empfohlen, niemals Pip zu verwenden, um systemweite Python Pakete zu ändern, da diese von apt-get unter Ubuntu verwaltet werden.

71
Alexey C.

Diese Schritte haben für mich funktioniert.

1- Deinstallieren Sie das Pip-Update von Python.
2- Deinstallieren Sie das Pip-Paket von Ihrem Ubuntu.
3- Überprüfen Sie, ob die Pip-Binärdatei nicht länger in Ihrem System vorhanden ist.

python -m pip uninstall pip
apt remove python-pip
whereis pip

4- Pip herunterladen und installieren. ( Credits für 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

Jetzt sollten Sie jedes beliebige Pip-Paket installieren können.

19
Jose Serodio

Mein Cent hatte ich den gleichen ImportError: cannot import name main.

Mein System ist ein Linux Ubuntu Distro, ich habe diesen Befehl ausgeführt:

python -m pip uninstall pip

Dies hat eine lokale (für den Benutzer) pip-Version entfernt. 

Ich hatte bereits eine ältere pip/pip2-Systemdatei (apt-get, die im Alter installiert wurde), die wie ein Zauber funktionierte.

1
Fabiano Tarlao

Wie in der Github-Ausgabe von pip vorgeschlagen

Der vorläufige Fix ist - 

Bearbeiten Sie Ihre /usr/bin/pip-Datei und kommentieren Sie die Zeile, in der main importiert wird, und bearbeiten Sie sie 

#from pip import main
from pip._internal import main as main

Funktionierte perfekt für mich . Hinweis - Dies ist eine temporäre Lösung. Warten Sie, bis der Team Pip das behoben hat.

OR

from pip import main
if __== '__main__':
    sys.exit(main())

zu diesem:

from pip import __main__
if __== '__main__':
    sys.exit(__main__._main())

Wie in diese SO Antwort vorgeschlagen.

1
markroxor

Versuche dies 

Überprüfen Sie die von Ihnen verwendete python-Version

# Python --version

und versuche, für zB zu installieren, wenn deine Version 2.7 ist

#python2.7 <package name> 

Funktioniert gut ......

0
Javeed Shakeel