Symbol nicht gefunden: __PyCodecInfo_GetIncrementalDecoder

74

Seit dem Update von Homebrew Python 2.7.11 (von 2.7.10) kann ich mein Paket plötzlich nicht mehr über die PyCharm IDE-Konsole auf PyPi registrieren.

Laufen (als "externes Tool")

python -B setup.py register -r pypitest

Ich verstehe jetzt

Traceback (most recent call last):
  File "setup.py", line 22, in <module>
    from setuptools import setup
  File "/usr/local/lib/python2.7/site-packages/setuptools/__init__.py", line 12, in <module>
    from setuptools.extension import Extension
  File "/usr/local/lib/python2.7/site-packages/setuptools/extension.py", line 8, in <module>
    from .dist import _get_unpatched
  File "/usr/local/lib/python2.7/site-packages/setuptools/dist.py", line 16, in <module>
    from setuptools.depends import Require
  File "/usr/local/lib/python2.7/site-packages/setuptools/depends.py", line 6, in <module>
    from setuptools import compat
  File "/usr/local/lib/python2.7/site-packages/setuptools/compat.py", line 17, in <module>
    import httplib
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 80, in <module>
    import mimetools
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/mimetools.py", line 6, in <module>
    import tempfile
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/tempfile.py", line 32, in <module>
    import io as _io
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/io.py", line 51, in <module>
    import _io
ImportError: dlopen(/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so, 2): Symbol not found: __PyCodecInfo_GetIncrementalDecoder
  Referenced from: /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
  Expected in: flat namespace
 in /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so

Process finished with exit code 1

Ich bin mir nicht sicher, wie ich vorgehen soll. Ich bekomme dieses Problem nur, wenn ich es über die Konsole meiner IDE ausführe. Wenn ich es direkt über die Systembefehlszeile (Terminal unter OS X) mache, habe ich keine Probleme.


OS X 10.11.3; Homebrew Python 2.7.11; PyCharm 5.0.3

orome
quelle
Als Fehler gemeldet .
Orome
2
Ich hatte den gleichen Fehler, auch unter OS X: virtualenv funktionierte unter anaconda nicht für mich - ich würde es mit anaconda nicht brauchen, aber ich konnte keine Hosen installieren, deren Installationsprogramm virtualenv verwendet. Nach dem Downgrade von Python 2.7.11 auf 2.7.10 in einem Conda Env wurde das Problem gelöst ...
Sergey Orshanskiy
1
Dies scheint nach jedem Python-Update zu geschehen.
Orome
Die Verwendung des vollständigen Pfads zum Interpreter in der Definition des externen Tools scheint dies zu beheben (obwohl nicht klar ist, warum dies erforderlich sein sollte ).
Orome
Beim Versuch, Python für die Verwendung des Mozilla Firefox-Build-Programms zu installieren, ist dieser Fehler aufgetreten. Die am besten bewertete Antwort hat auch für mich funktioniert.
nc.

Antworten:

199

tl; dr: Beheben Sie dieses Problem, indem Sie einen der folgenden Schritte ausführen:

  • Typ hash -r python, ODER
  • abmelden und anmelden.

EDIT: Eine Antwort auf meine verwandte Frage macht deutlich, was hier passiert. Wenn Sie eine neue Version von Python installieren, müssen Sie möglicherweise ausführen hash -r python, um bash anzuweisen, den "zwischengespeicherten" Speicherort auf die pythonausführbare Datei zurückzusetzen.

In meinem Fall tippte ich python, was auf meinem $PATHat war /usr/local/bin/python. bashVerwendete aber immer noch den alten Cache-Speicherort /usr/bin/python. Also wurde die alte ausführbare Datei aufgerufen, aber der neue Pfad wurde für Python bereitgestellt sys.argv[0]. Dies bedeutet, dass die alte ausführbare Datei ausgeführt wurde, der neue sys.executableWert jedoch dazu führte, dass alle falschen Module (einschließlich des ioModuls) geladen wurden .


Ich habe das gleiche Problem. Ich habe Python 2.7.11 über ein Installationsprogramm von Python.org installiert. Seltsamerweise scheint das Problem mit einem subtilen Unterschied zwischen dem Start von OSX pythonbeim Aufrufen der Shell über den vollständigen Pfad und der Verwendung nur des Wortes zu zusammenhängen python.

Für mich funktioniert dies also (Python über den vollständigen Pfad aufrufen /usr/local/bin/python):

$ which python
/usr/local/bin/python
$ /usr/local/bin/python -c "import io"
$

... aber das geht nicht:

$ python -c "import io"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/io.py", line 51, in <module>
    import _io
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so, 2): Symbol not found: __PyCodecInfo_GetIncrementalDecoder
  Referenced from: /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
  Expected in: flat namespace
 in /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so

Um dieses Problem zu umgehen, können Sie versuchen, dasselbe zu tun.

An anderer Stelle habe ich eine separate Frage zu diesem rätselhaften Verhalten gestellt. Vielleicht pythonruft das bloße Aufrufen irgendwie eine seltsame Mischung der ausführbaren Datei 2.7.11 mit den Dylibs 2.7.10 auf?

Stuart Berg
quelle
3
Login und Logout funktionierten. Insbesondere hatte ich Python während der Sitzung mit Brew installiert.
GiriB
1
Muss StackOverflow lieben !!
Srini
4
Wenn hash -r pythonzu viele Argumente angegeben sind, können Sie den rehashBefehl verwenden.
Sisyphus
21

Laut https://github.com/klen/python-mode/issues/634 :

Ich hatte das gleiche Problem, aber erfolgreich behoben. In meinem Fall habe ich Python und Vim mit Homebrew kompiliert, wenn PYTHON_PATH angegeben und auf eine meiner Entwicklungsumgebungen festgelegt wurde, in der ich auch einige Bibliotheken hatte, einschließlich io. Die Problemumgehung war einfach: Öffnen Sie ein neues Terminal, stellen Sie sicher, dass Sie kein benutzerdefiniertes PYTHON_PATH haben, deinstallieren Sie Python und deinstallieren Sie vim. Installieren Sie beide neu.

und

Problem gelöst.

Culprit ist das Update von Python 2.7.10 auf 2.7.11.

Wenn Sie die Steuerung des Conda-Pakets verwenden, führen Sie einfach "conda install python = 2.7.10" aus, um dieses Problem zu beheben.

Dies gibt jedoch nicht die Grundursache an. Da dies passiert _io, sieht dies aus wie ein Fehler in Python 2.7.11 (unwahrscheinlich, dass es zu einem Aufschrei im Weltmaßstab und einer sofortigen Behebung kommen würde) oder ein Verpackungsfehler oder eine Versionsinkongruenz speziell mit der Homebrew-Version (und möglicherweise einigen) auch verwandte).

Versuchen Sie es import _ioin der Konsole. Wenn dies erfolgreich ist, überprüfen Sie, ob es aus demselben Pfad geladen wurde.

ivan_pozdeev
quelle
Seltsamerweise tritt dieses Problem nur auf, wenn ich es über die Konsole meiner IDE ausführe. Wenn ich es direkt über die Systembefehlszeile (Terminal unter OS X) mache, habe ich keine Probleme. Ich vermute den Pfad in meiner IDE.
Orome
@raxacoricofallapatorius prüft Umgebungen, ausführbare Pfade und sys.pathauf Unterschiede.
ivan_pozdeev
2
Ich benutze keine Anakonda, aber an diesem Punkt denke ich, dass die Installation mein einfachster Weg sein wird, da Homebrew keine früheren Versionen von Python "on tap" hat
skybondsor
1
@skybondsor Ich habe die Seite mit den vorherigen Versionen auf python.org gefunden. Hier finden Sie das Mac-Installationsprogramm für die Version 2.7.10. Python Version 2.7.10
Codious-JR
3
Das grundlegende Problem hierbei ist, dass der hashCache von bash sofort nach der Installation einer neuen Python-Version falsch werden kann. (Versuchen Sie type pythonzu überprüfen, ob dies das Problem ist.) Die von Ihnen angegebene Person hat dies möglicherweise versehentlich durch alle beschriebenen Deinstallationen / Neuinstallationen behoben. Die einfache Lösung besteht jedoch darin, hash -r pythonin das Terminal einzugeben.
Stuart Berg
12

Installieren Sie Python neu.

brew unlink python && brew reinstall python

Sichern Sie den Weg

export PYTHONPATH=$PYTHONPATH:/usr/local/bin/

SICHERN und Ändern Sie die Reihenfolge der "Pfade" -Datei.

sudo nano /etc/paths

Es scheint, die Reihenfolge der Pfade, es ist entscheidend, Python richtig auszuführen. In meinem Fall war das Ergebnis:

#sudo nano /etc/paths
  /usr/bin  
  /usr/local/bin
  /bin
  /usr/sbin
  /sbin

Auf meinem Mac ist der Pfad so.

$ which python
    /usr/local/bin/python

Jetzt kann ich beide ausführen:

$ /usr/local/bin/python -c "import io"
$ python -c "import io"
Noel Ruault
quelle
6

Ich hatte das gleiche Problem, es wurde erfolgreich behoben, indem nur die Datei _io.so ersetzt wurde.

sudo find / -name _io.so

Kopieren Sie den Pfad der _io.soDatei, die NICHT zu Python-2.7.11 gehört. Kopieren Sie beispielsweise den Pfad von _io.so unter python-2.7.5: /usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib- dynload / _io.so

Ersetzen Sie die /usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.soDatei durch die _io.sogerade gefundene.

Yanan
quelle
1
Das Mischen und Anpassen von Erweiterungsmodulen aus Python 2.7.11 und dem System Python, das auf neueren Systemen 2.7.10 ist, ist eine sehr grobe Methode, um dieses Problem zu beheben. Das Hauptproblem besteht darin, dass Python 2.7.10 versucht, ein Modul zu importieren, das zu 2.7.11 gehört. Das Symbol ist in 2.7.11 definiert, jedoch nicht in 2.7.10. Eine bessere Lösung besteht darin, zu verstehen, warum Python 2.7.10 überhaupt aufgerufen wird.
Tim Smith
Danke Tim. Ich stoße bei der Verwendung von Anaconda auf dieses Problem. Anaconda2.4.1 hat scipy-0.16.0 als eine der Abhängigkeiten, und scipy-0.16.0 erfordert Python 2.7.11. Die Standardpython in Anaconda ist 2.7.10 (und die übrigen abhängigen Bibliotheken verwenden 2.7.10), sodass ich sie nach dem Upgrade auf die neueste Anaconda nicht verwenden konnte. Während ich auf die offizielle Fehlerbehebung von Anaconda warte, muss ich mehrere Conda-Skripte ausführen. Deshalb habe ich mich entschlossen, das Problem vorübergehend auf diese grobe Weise zu lösen.
Yanan
Nach der Installation von Dato Launcher hatte ich dieses Problem. Nachdem ich viele der oben genannten Optionen ausprobiert hatte, half dies.
Gogasca
3

Das ist mir auch in MacVim passiert. Ich löste es , indem sichergestellt :python print(sys.path)wird unter Verwendung von System Python (zB /Library/Python/2.7/...)

Da ich MacVim über Homebrew installiert habe, habe ich das einfach so gemacht:

  1. Spawn eine neue Shell, die which python-> hatte /usr/bin/python. Für meinen Fall musste ich die pyenvLinie von meinem entfernen .bash_profile. Wenn Sie Python über Homebrew installiert haben, möchten Sie möglicherweise brew unlink pythonzuerst

  2. brew reinstall macvim

kizzx2
quelle
Das hat es für mich behoben. Vielen Dank!
James McLaughlin
3

Wenn Ihr Problem durch verursacht wird anaconda, ist es nicht erforderlich, das //anacondaVerzeichnis zu entfernen .

Öffnen Sie einfach Ihre ~/.bash_profile, finden Sie die Linie

export PATH="//anaconda/bin:$PATH

und kommentieren Sie es aus, und starten Sie dann Ihre Terminalsitzung neu.

Fermats kleiner Student
quelle
3

Eine weitere schnelle Problemumgehung, wenn Sie nichts dagegen haben, bei Python 2.7.10 zu bleiben, besteht darin, den Pfad der ausführbaren Python-Interpreter-Datei anzugeben, die für die virtuelle Umgebung verwendet wird. Unter OSX lautet dieser Pfad normalerweise /usr/bin/python:

virtualenv venv --python=/usr/bin/python
skeller88
quelle
1

Ich kann keinen Kommentar (?) Hinzufügen, daher funktioniert dies nur, um meine Erfahrung zu teilen. Ein Downgrade auf 2.7.10 funktioniert für mich.

tngn
quelle
1

Ich habe diesen Fehler nach einem fehlgeschlagenen NLTK-Download erhalten. Ich musste anaconda deinstallieren:

sudo rm -rf ~/anaconda 
update PATH variable
Gogasca
quelle
0

Dies geschah, als ich bereits versucht hatte, ein Venv in einem Ordner zu erstellen, und fälschlicherweise versuchte, ein zweites zu initialisieren! Also habe ich gerade das venv-Verzeichnis entfernt und den Befehl erneut ausgeführt. Sehr wahrscheinlich ist dies nicht die Antwort auf diese Lösung, aber die Suche nach meinem Fehler hat mich hierher gebracht, sodass es einigen anderen helfen kann, die nicht weiterkommen.

Ethan Keller
quelle
0

Ich habe dieses Problem gelöst, indem ich den symbolischen Link entfernt /usr/local/binund die eigentliche Python-Binärdatei kopiert habe, auf die dieser Link dort verwiesen hat.

Chris Goy
quelle
0

Ich hatte das gleiche Problem, als ich versuchte, PyCharm zu verwenden. Gelöst durch Festlegen von "Python Interpreter" in der Projektkonfiguration, um auf die virtuelle Python-Umgebung zu verweisen, die ich verwenden wollte, nämlich eine Anaconda-Umgebung. Irgendwie fehlte dem Interpreterpfad der "Anaconda" -Teil von ~ /.../ anaconda /.../_ io.so. Anaconda muss nicht deinstalliert werden.

Kai
quelle