Python3: ImportError: Kein Modul mit dem Namen '_ctypes', wenn Value from module multiprocessing verwendet wird

126

Ich benutze Ubuntu und habe Python 2.7.5 und 3.4.0 installiert. In Python 2.7.5 kann ich eine Variable erfolgreich zuweisen x = Value('i', 2), aber nicht in 3.4.0. Ich bekomme:

Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "/usr/local/lib/python3.4/multiprocessing/context.py", line 132, in Value
      from .sharedctypes import Value
   File "/usr/local/lib/python3.4/multiprocessing/sharedctypes.py", line 10, in <
module>
   import ctypes
   File "/usr/local/lib/python3.4/ctypes/__init__.py", line 7, in <module>
      from _ctypes import Union, Structure, Array
ImportError: No module named '_ctypes'

Ich habe gerade durch die Installation der Quelle von 3.4.0 auf 3.3.2 aktualisiert. Es wurde in /usr/local/lib/python3.4 installiert .

Habe ich korrekt auf Python 3.4 aktualisiert?

Eines ist mir aufgefallen, dass Python 3.4 in usr / local / lib installiert ist, während Python 3.3.2 noch in usr / lib installiert ist , sodass es nicht überschrieben wurde.

htc_m8
quelle
Es scheint, dass während der "Installation der Quelle von 3.4.0" etwas verschmutzt wurde. Was bedeutet das genau? Funktionierte dieser Befehl in 3.3.2?
mechanisches
Ich habe aus dem Quellcode mit dem Befehl sudo make install installiert. Ja, das Importieren von Wert aus der
Mehrfachverarbeitung
8
_ctypeswurde nicht erstellt, da die libffi-devAbhängigkeit nicht verfügbar war. Verwenden Sie stattdessen die Deadsnakes PPA .
Eryk Sun
11
Die Installation von libffi-dev und die Neuinstallation von python3.4 haben das Problem für mich
behoben

Antworten:

224

Das Installieren libffi-devund erneute Installieren von python3.7 hat das Problem für mich behoben.

py 3.7 sauber zu bauen libffi-dev ist erforderlich, sonst scheitern spätere Sachen

Bei Verwendung von RHEL / Fedora:

yum install libffi-devel

oder

sudo dnf install libffi-devel

Bei Verwendung von Debian / Ubuntu:

sudo apt-get install libffi-dev
dotbit
quelle
35
Ich habe installiert, libffi-devaber ich
erhalte
1
Wenn Sie Linux verwenden, führen Sie aus ldconfig, um das neue zu laden libffi.so. Der Hauptzweck von apt-get install libffi-devist die Installation einer Datei namens, libffi.sodie Sie von dpkg -L libffi-dev@tushar_ecmc
Ben-xue
14
Beachten Sie, dass Sie, wenn Sie Ihre eigene Python-Distribution kompiliert haben (z. B. bis pyenv install), die Distribution nach der Installation des Pakets neu kompilieren müssen.
24.
121

Klonen Sie auf einem neuen Debian-Image https://github.com/python/cpython und führen Sie Folgendes aus:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus
sudo apt-get install libncursesw5-dev libgdbm-dev libc6-dev
sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev
sudo apt-get install libssl-dev openssl
sudo apt-get install libffi-dev

Führen Sie nun die configureoben geklonte Datei aus:

./configure
make # alternatively `make -j 4` will utilize 4 threads
sudo make altinstall

Habe 3.7 installiert und arbeite für mich.

LEICHTES UPDATE

Sieht so aus, als hätte ich gesagt, ich würde diese Antwort mit weiteren Erklärungen aktualisieren, und zwei Jahre später habe ich nicht viel hinzuzufügen.

Abgesehen davon denke ich, dass die Wahl darin besteht, entweder die gesuchte cpython-Codebasis durchzulesen #include , die erfüllt werden müssen. Normalerweise versuche ich jedoch weiterhin, das Paket zu installieren, und lese einfach die Ausgabe durch, in der die erforderlichen Pakete installiert werden, bis sie ausgeführt werden gelingt es.

Erinnert mich an die Geschichte des Ingenieurs, des Managers und des Programmierers, dessen Auto einen Hügel hinunter rollt .

MikeiLL
quelle
3
Fantastisch. Können Sie mir jetzt sagen, wie Sie zu der obigen Liste gekommen sind? Durch Ausprobieren? : -O
Veky
4
Ehrlich gesagt, @Veky Ich habe eine Websuche nach dem Fehler "ImportError: Kein Modul mit dem Namen '_ctypes'" durchgeführt und mich umgesehen und wahrscheinlich ein paar Dinge ausprobiert, bevor es funktionierte. Wird die Antwort aktualisieren, um mit meinem geringen Verständnis von APT, Python, make usw. zu klären.
MikeiLL
Es sollte python3-devstatt sein python-dev. python-devscheint für python2.
Timo
Warum sollten Sie ein Quellcode-Repo klonen und dann verwenden sudo apt-get? Das macht einfach keinen Sinn. sudo apt-getkümmert sich um das Herunterladen von bereits kompiliertem Code. Warum laden Sie den Code herunter und verwenden ihn dann nicht?
Ryan
1
@MikeiLL Ich habe festgestellt, dass alle sudoAnweisungen die Voraussetzungen installieren, um den heruntergeladenen Quellcode zu erstellen. Das ./configureund makeZeug erfordert die Installation dieser Dinge.
Ryan
28

Wenn Sie pyenv verwenden und die Fehlermeldung "Kein Modul mit dem Namen '_ctypes'" (wie ich) unter Debian / Raspbian / Ubuntu erhalten, müssen Sie die folgenden Befehle ausführen:

sudo apt-get install libffi-dev
pyenv uninstall 3.7.6
pyenv install 3.7.6

Fügen Sie Ihre Version von Python anstelle von 3.7.6 ein

Evgeniy
quelle
Willkommen beim Stapelüberlauf. Können Sie weitere Informationen bereitstellen? Referenzen usw. und werfen Sie
Nodejs-nerd
Vielen Dank für die Antwort. Der am höchsten gewählte hatte die vollständige Liste, die ich wahrscheinlich brauchte, aber dies erinnerte mich daran, über neu zu installieren pyenv, um die Dinge tatsächlich zum Laufen zu bringen. Die Verwendung von pyenv ist viel einfacher, als den Quellcode abzurufen und alles makesicher zu erledigen .
dragon788
Dies funktionierte für mich unter Ubuntu. Einfach und effektiv.
Phil
Danke, das war hilfreich. Eine vollständige Liste der Voraussetzungen für pyenv finden Sie unter github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites
Paweł Mucha
Sie müssen Python nicht zuerst deinstallieren. Wenn Sie es einfach erneut installieren, wird die Python-Binärdatei neu kompiliert, und genau das ist erforderlich.
RusI
22

Detaillierte Schritte zur Installation von Python 3.7 unter CentOS oder einem beliebigen Redhat-Linux-Computer:

  1. Laden Sie Python von https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz herunter
  2. Extrahieren Sie den Inhalt in einen neuen Ordner
  3. Öffnen Sie das Terminal im selben Verzeichnis
  4. Führen Sie den folgenden Code Schritt für Schritt aus:
sudo yum -y install gcc gcc-c++ 
sudo yum -y install zlib zlib-devel
sudo yum -y install libffi-devel 
./configure
make
make install
Alok Deep
quelle
14

Ich dachte, ich würde die Centos-Installationen hinzufügen:

sudo yum -y install gcc gcc-c++ 
sudo yum -y install zlib zlib-devel
sudo yum -y install libffi-devel 

Überprüfen Sie die Python-Version:

python3 -V

Erstellen Sie virtualenv:

virtualenv -p python3 venv

SE Furgeson
quelle
2
Dies wurde als minderwertig gekennzeichnet, und ich sehe es in der Überprüfungswarteschlange. Es funktioniert wirklich nicht als eigenständige Antwort. Ich werde das Löschen empfehlen, aber vielleicht können Sie es verbessern, indem Sie es erweitern?
Dbliss
10

Ich habe diesen Fehler festgestellt, als ich versucht habe, Python 3.7.3 in Ubuntu 18.04 mit dem nächsten Befehl zu installieren : $ pyenv install 3.7.3. Die Installation war nach dem Ausführen erfolgreich $ sudo apt-get update && sudo apt-get install libffi-dev(wie hier vorgeschlagen ). Das Problem wurde gelöst dort .

akpp
quelle
5

Keine der Lösungen funktionierte. Sie müssen Ihre Python erneut kompilieren. Sobald alle erforderlichen Pakete vollständig installiert waren.

Folge dies:

  1. Installieren Sie die erforderlichen Pakete
  2. Lauf ./configure --enable-optimizations

https://gist.github.com/jerblack/798718c1910ccdd4ede92481229043be

Arash Mohammadi
quelle
1
Tolle Antwort eigentlich. Jeder erwähnt, dass Sie libffi-devel benötigen und dass es es lösen würde. Das Problem ist, dass Sie auch Python neu kompilieren müssen. Ich habe auch libffi aufgegeben.
Aleksander Fular
2

In diesem Thread finden Sie für die benutzerdefinierte Installation von libffi. Für Python3.7 ist es schwierig, den Bibliotheksverzeichnis von libffi zu finden. Eine alternative Methode besteht beispielsweise darin, die CONFIGURE_LDFLAGSVariable im Makefile festzulegen CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64".

pengchy
quelle
Die Verbindung ist unterbrochen. Ich habe versucht, die Änderung im Makefile vorzunehmen, wie Sie hier zeigen, aber es hat nicht funktioniert. _ctypes wird immer noch nicht erstellt.
user5915738
2

Meine Lösung: Die Installation von libffi-dev mit apt-get hat nicht geholfen. Aber das hat geholfen: libffi von der Quelle installieren und dann Python 3.8 von der Quelle installieren.

Meine Konfiguration: Ubuntu 16.04 LTS Python 3.8.2

Schritt für Schritt:

Beim Starten des Debuggers über Visual Studio Code und beim Ausführen wurde die Fehlermeldung "ModuleNotFoundError: Kein Modul mit dem Namen '_ctypes'" angezeigt python3 -c "import sklearn; sklearn.show_versions()".

  • Laden Sie libffi v3.3 von https://github.com/libffi/libffi/releases herunter
  • libtool installieren: sudo apt-get install libtool In der Datei README.md von libffi wird erwähnt, dass auch Autoconf und Automake erforderlich sind. Sie wurden bereits auf meinem System installiert.
  • Konfigurieren Sie libffi ohne Dokumente:

./configure --disable-docs

make check

sudo make install

Danach konnte meine Python-Installation _ctypes finden.

Rolf Kampffmeyer
quelle
2

Dies löste den gleichen Fehler für mich auf Debian :

sudo apt-get install libffi-dev

und erneut kompilieren

Referenz: issue31652

hassanzadeh.sd
quelle
0

Wenn es Ihnen nichts ausmacht, Miniconda zu verwenden , werden standardmäßig die erforderlichen externen Bibliotheken und _ctypes installiert. Es nimmt mehr Platz in Anspruch und erfordert möglicherweise die Verwendung einer mäßig älteren Version von Python (z. B. 3.7.6 anstelle von 3.8.2 zum Zeitpunkt dieses Schreibens).

Christopher Bottoms
quelle
0

Sie müssen die fehlenden PHP3-Module (Python3) aus dem Paketmanager laden. Wenn Sie Ubuntu haben, empfehle ich Folgendes Synaptic Package Manager:

sudo apt-get install synaptic

Dort können Sie einfach nach den fehlenden Modulen suchen. Suchen Sie nach ctypes und installieren Sie alle Pakete. Gehen Sie dann zu Ihrem Python-Verzeichnis und tun Sie es

./configure
make install.

Dies sollte Ihr Problem lösen.

AnthonyS
quelle
-1

Wenn Sie etwas tun, wird Ihnen hier niemand zuhören, weil "Sie es falsch machen", aber Sie müssen es aus zu dummen Gründen "falsch machen" (in meinem Fall wird es schnell zu einem Foul Worte über jemanden im Devops-Team (übergewichtige Mutter), müssen Sie zuerst:

Holen Sie sich libffi und installieren Sie es wie gewohnt in Ihrem Benutzerinstallationsbereich.

git clone https://github.com/libffi/libffi.git
cd libffi
./configure --prefix=path/to/your/install/root
make
make install

Kehren Sie dann zu Ihrer Python 3-Quelle zurück und suchen Sie diesen Teil des Codes in setup.py auf der obersten Ebene des Python-Quellverzeichnisses

        ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
        if not ffi_inc or ffi_inc[0] == '':
            ffi_inc = find_file('ffi.h', [], inc_dirs)
        if ffi_inc is not None:
            ffi_h = ffi_inc[0] + '/ffi.h'
            if not os.path.exists(ffi_h):
                ffi_inc = None
                print('Header file {} does not exist'.format(ffi_h))
        ffi_lib = None
        if ffi_inc is not None:
            for lib_name in ('ffi', 'ffi_pic'):
                if (self.compiler.find_library_file(lib_dirs, lib_name)):
                    ffi_lib = lib_name
                    break

        ffi_lib="ffi"  # --- AND INSERT THIS LINE HERE THAT DOES NOT APPEAR ---
        if ffi_inc and ffi_lib:
            ext.include_dirs.extend(ffi_inc)
            ext.libraries.append(ffi_lib)
            self.use_system_libffi = True

und füge die Zeile hinzu, die ich oben mit dem Kommentar markiert habe. Warum es notwendig ist und warum es keine Möglichkeit gibt, die Konfiguration so zu gestalten, dass '--without-system-ffi` auf Linux-Plattformen respektiert wird, werde ich vielleicht in den nächsten Stunden herausfinden, warum dies "nicht unterstützt" wird, aber alles hat seitdem gearbeitet. Ansonsten viel Glück ... YMMV.

WAS ES TUT: Überschreibt einfach die Logik dort und veranlasst den Compiler-Verknüpfungsbefehl, "-lffi" hinzuzufügen, was alles ist, was es wirklich braucht. Wenn Sie die Bibliothek vom Benutzer installiert haben, werden die Header wahrscheinlich gut erkannt, solange Sie sie PKG_CONFIG_PATHenthalten path/to/your/install/root/lib/pkgconfig.

slowkoni
quelle