Python3: ImportError: Nessun modulo denominato "_ctypes" quando si utilizza Value dal multiprocessing del modulo


127

Sto usando Ubuntu e ho installato Python 2.7.5 e 3.4.0. In Python 2.7.5 sono in grado di assegnare correttamente una variabile x = Value('i', 2), ma non in 3.4.0. Sto ottenendo:

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'

Ho appena aggiornato alla 3.3.2 installando i sorgenti della 3.4.0. È installato in /usr/local/lib/python3.4 .

Ho aggiornato correttamente a Python 3.4?

Una cosa ho notato che Python 3.4 è installato in usr / local / lib , mentre Python 3.3.2 è ancora installato in usr / lib , quindi non è stato sovrascritto.


Sembra che qualcosa si sia sporcato durante l '"installazione dei sorgenti della 3.4.0". Cosa significa esattamente? Quel comando funzionava nella 3.3.2?
Mechanical_meat

Ho installato dal codice sorgente utilizzando il comando sudo make install. Sì, l'importazione di valore dal multiprocessing ha funzionato in 3.3.2
htc_m8

8
_ctypesnon è stato creato perché la libffi-devdipendenza non era disponibile. Considera invece di utilizzare il deadsnakes PPA .
Eryk domenica

11
L'installazione di libffi-dev e la reinstallazione di python3.4 hanno risolto il problema per me
htc_m8

Risposte:


226

L'installazione libffi-deve la reinstallazione di python3.7 hanno risolto il problema per me.

per compilare in modo pulito libffi-dev è necessario py 3.7 altrimenti le cose successive falliranno

Se si utilizza RHEL / Fedora:

yum install libffi-devel

o

sudo dnf install libffi-devel

Se si utilizza Debian / Ubuntu:

sudo apt-get install libffi-dev

35
Ho installato libffi-devma ricevo ancora questo errore
tushar_ecmc

2
Se stai usando linux, esegui ldconfigper caricare il nuovo file libffi.so. Lo scopo principale di apt-get install libffi-devè installare un file chiamato libffi.soche puoi controllare da dpkg -L libffi-dev@tushar_ecmc
Ben-xue

14
Nota che se hai compilato la tua distribuzione Python (ad esempio tramite pyenv install), dovrai ricompilare la distribuzione dopo aver installato il pacchetto.
annullato il

121

Su una nuova immagine Debian, clonando https://github.com/python/cpython ed eseguendo:

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

Ora esegui il configurefile clonato sopra:

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

Ho 3.7 installato e funziona per me.

LEGGERO AGGIORNAMENTO

Sembra che abbia detto che avrei aggiornato questa risposta con qualche spiegazione in più e due anni dopo non ho molto da aggiungere.

  • questo post SO spiega perché alcune librerie come python-devpotrebbero essere necessarie.
  • questo post SO spiega perché si potrebbe usare l' argomento altinstallopposto installall'argomento nel comando make .

A parte questo, immagino che la scelta sarebbe quella di leggere la base di codice cpython alla ricerca di #includedirettive che devono essere soddisfatte, ma quello che di solito faccio è continuare a provare a installare il pacchetto e continuare a leggere l'output installando i pacchetti richiesti fino a quando non riesce.

Mi ricorda la storia dell'Ingegnere, del Manager e del Programmatore la cui macchina rotola giù da una collina .


3
Fantastico. Ora, puoi dirmi come hai ottenuto l'elenco sopra? Per tentativi ed errori? : -O
Veky

4
Onestamente, @Veky ho cercato sul web l'errore "ImportError: No module named '_ctypes'" e ho cercato, probabilmente, alcune cose prima che funzionasse. Aggiornerò la risposta per chiarire con la mia scarsa comprensione di APT, Python, make, ecc.
MikeiLL

Dovrebbe essere python3-devinvece di python-dev. python-devsembra per python2.
Timo

Perché clonare un repository di codice sorgente e quindi utilizzarlo sudo apt-get? Non ha alcun senso. sudo apt-getgestisce il download del codice già compilato, quindi perché scarichi il codice e poi non lo usi?
Ryan

1
@ MikeiLL mi sono reso conto che tutte le sudoistruzioni stanno installando i prerequisiti per poter costruire il codice sorgente che hai scaricato. l' ./configuree makeroba richiede quelle cose per essere installato.
Ryan

29

Se usi pyenv e ottieni l'errore "Nessun modulo chiamato '_ctypes'" (come me) su Debian / Raspbian / Ubuntu devi eseguire questi comandi:

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

Metti la tua versione di python invece di 3.7.6


Benvenuto in Stack Overflow. Potete fornire maggiori informazioni? Riferimenti ecc e dare un'occhiata a stackoverflow.com/help/how-to-answer
Nodejs-secchione

Grazie per la risposta, il voto più alto aveva l'elenco completo di cui probabilmente avevo bisogno, ma questo mi ha ricordato di reinstallare tramite pyenvper far funzionare effettivamente le cose. Usare pyenv è molto più semplice che prendere il codice sorgente e fare tutte le makecose di sicuro.
dragon788

Questo ha funzionato per me su Ubuntu. Semplice ed efficace.
Phil

Grazie, è stato utile. Per l'elenco completo dei prerequisiti per pyenv, visita github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites
Paweł Mucha

Non è necessario disinstallare prima Python. Basta installarlo di nuovo per ricompilare il binario di Python e questo è ciò che è necessario.
RusI

22

Passaggi dettagliati per installare Python 3.7 in CentOS o qualsiasi macchina Linux redhat:

  1. Scarica Python da https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
  2. Estrai il contenuto in una nuova cartella
  3. Apri Terminal nella stessa directory
  4. Esegui passo dopo passo il codice:
sudo yum -y install gcc gcc-c++ 
sudo yum -y install zlib zlib-devel
sudo yum -y install libffi-devel 
./configure
make
make install

14

Ho pensato di aggiungere le installazioni Centos:

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

Controlla la versione di Python:

python3 -V

Crea virtualenv:

virtualenv -p python3 venv


2
questo è stato contrassegnato come di bassa qualità e lo sto guardando nella coda delle revisioni. in realtà non funziona come risposta autonoma. sto per consigliare la cancellazione, ma forse puoi migliorarla espandendola?
dbliss

11

Mi imbatto in questo errore quando ho provato ad installare Python 3.7.3 in Ubuntu 18.04 con comando successivo: $ pyenv install 3.7.3. L'installazione è riuscita dopo l'esecuzione $ sudo apt-get update && sudo apt-get install libffi-dev(come suggerito qui ). Il problema è stato risolto .


6

Nessuna delle soluzioni ha funzionato. Devi ricompilare di nuovo il tuo python; una volta che tutti i pacchetti richiesti sono stati completamente installati.

Segui questo:

  1. Installa i pacchetti richiesti
  2. Correre ./configure --enable-optimizations

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


2
Ottima risposta in realtà. Tutti menzionano che hai bisogno di libffi-devel e che lo risolverebbe, il problema è che devi anche ricompilare python. Ho anche rinunciato a libffi.
Aleksander Fular

3

Fare riferimento a questo thread , per l'installazione personalizzata di libffi, è difficile per Python3.7 trovare la posizione della libreria di libffi. Un metodo alternativo consiste CONFIGURE_LDFLAGSnell'impostare la variabile nel Makefile, ad esempio CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64".


Il collegamento è interrotto. Ho tentato di apportare la modifica nel Makefile come mostrato qui ma non ha funzionato. _ctypes non è ancora in fase di costruzione.
user5915738

2

La mia soluzione: l'installazione di libffi-dev con apt-get non ha aiutato. Ma questo ha aiutato: installare libffi dal sorgente e quindi installare Python 3.8 dal sorgente.

La mia configurazione: Ubuntu 16.04 LTS Python 3.8.2

Passo dopo passo:

Ho ricevuto il messaggio di errore "ModuleNotFoundError: Nessun modulo denominato" _ctypes "" all'avvio del debugger da Visual Studio Code e durante l'esecuzione python3 -c "import sklearn; sklearn.show_versions()".

  • scarica libffi v3.3 da https://github.com/libffi/libffi/releases
  • installa libtool: sudo apt-get install libtool il file README.md da libffi menziona che sono necessari anche autoconf e automake. Erano già installati sul mio sistema.
  • configurare libffi senza documenti:

./configure --disable-docs

make check

sudo make install

Dopo di che la mia installazione di Python potrebbe trovare _ctypes.


2

Questo ha risolto lo stesso errore per me su Debian :

sudo apt-get install libffi-dev

e compila di nuovo

Riferimento: issue31652


0

Se non ti dispiace usare Miniconda , le librerie esterne necessarie e _ctypes sono installati di default. Richiede più spazio e potrebbe richiedere l'utilizzo di una versione moderatamente precedente di Python (ad esempio 3.7.6 invece di 3.8.2 al momento della stesura di questo documento).


0

Devi caricare i moduli php3 (Python3) mancanti dal gestore dei pacchetti. Se hai Ubuntu ti consiglio Synaptic Package Manager:

sudo apt-get install synaptic

Lì puoi semplicemente cercare i moduli mancanti. cerca ctypes e installa tutti i pacchetti. Quindi vai alla tua directory Python e fai

./configure
make install.

Questo dovrebbe risolvere il tuo problema.


0

Avevo lo stesso problema. Nessuna delle soluzioni di cui sopra ha funzionato per me. La sfida principale era che non avevo l'accesso root. Quindi, per prima cosa scarico il sorgente di libffi. Poi l'ho compilato con i soliti comandi:

./configure --prefix=desired_installation_path_to_libffi
make 

Quindi ho ricompilato python usando

./configure --prefix=/home/user123/Softwares/Python/installation3/  LDFLAGS='-L/home/user123/Softwares/library/libffi/installation/lib64'
make 
make install

Nel mio caso, "home / user123 / Softwares / library / libffi / installation / lib64" è il percorso della directory di installazione di LIBFFI in cui si trova libffi.so. E / home / user123 / Softwares / Python / installation3 / è il percorso della directory di installazione di Python. Modificali secondo il tuo caso.


-1

Se stai facendo qualcosa di cui nessuno qui ti ascolterà perché "lo stai facendo nel modo sbagliato", ma devi farlo "nel modo sbagliato" per ragioni troppo asinine (per esempio, nel mio caso degrada rapidamente in fallo parole su qualcuno della madre sovrappeso del team devops), devi prima:

Ottieni libffi e installalo nella tua area di installazione utente nel solito modo.

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

Quindi torna alla tua sorgente Python 3 e trova questa parte del codice in setup.py al livello superiore della directory sorgente di Python

        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

e aggiungi la riga che ho segnato sopra con il commento. Perché è necessario, e perché non c'è modo di far sì che la configurazione rispetti '--without-system-ffi` su piattaforme Linux, forse scoprirò perché "non è supportato" nelle prossime due ore, ma tutto è ha funzionato da allora. Altrimenti, buona fortuna ... YMMV.

CHE COSA FA: sovrascrive la logica presente e fa sì che il comando di collegamento del compilatore aggiunga "-lffi" che è tutto ciò di cui ha veramente bisogno. Se la libreria è installata dall'utente, probabilmente sta rilevando correttamente le intestazioni purché PKG_CONFIG_PATHincluda path/to/your/install/root/lib/pkgconfig.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.