Python3: ImportError: ningún módulo llamado '_ctypes' cuando se usa el valor del multiprocesamiento del módulo

127

Estoy usando Ubuntu y he instalado Python 2.7.5 y 3.4.0. En Python 2.7.5 puedo asignar con éxito una variable x = Value('i', 2), pero no en 3.4.0. Estoy obteniendo:

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'

Acabo de actualizar a 3.3.2 mediante la instalación de la fuente de 3.4.0. Se instaló en /usr/local/lib/python3.4 .

¿Actualicé correctamente a Python 3.4?

Una cosa que noté es que Python 3.4 está instalado en usr / local / lib , mientras que Python 3.3.2 todavía está instalado en usr / lib , por lo que no se sobrescribió.

htc_m8
fuente
Parece que algo se estropeó durante la "instalación de la fuente de 3.4.0". ¿Qué significa eso exactamente? ¿Ese comando estaba funcionando en 3.3.2?
mechanical_meat
Lo instalé desde el código fuente usando el comando sudo make install. Sí, la importación de valor de multiprocesamiento funcionó en 3.3.2
htc_m8
8
_ctypesno se creó porque la libffi-devdependencia no estaba disponible. Considere usar el PPA de deadsnakes en su lugar.
Eryk Sun
11
Instalar libffi-dev y reinstalar python3.4 solucionó el problema para mí
htc_m8

Respuestas:

226

La instalación libffi-devy reinstalación de python3.7 me solucionó el problema.

para construir limpiamente py 3.7 libffi-dev se requiere o de lo contrario fallarán las cosas posteriores

Si usa RHEL / Fedora:

yum install libffi-devel

o

sudo dnf install libffi-devel

Si usa Debian / Ubuntu:

sudo apt-get install libffi-dev
dotbit
fuente
35
Lo he instalado libffi-devpero sigo recibiendo este error
tushar_ecmc
2
Si está usando Linux, ejecute ldconfig para cargar el nuevo libffi.so. El propósito principal de apt-get install libffi-deves instalar un archivo llamado libffi.soque puede verificar por dpkg -L libffi-dev@tushar_ecmc
Ben-xue
14
Tenga en cuenta que si ha compilado su propia distribución de Python (por ejemplo, a través de pyenv install), deberá volver a compilar la distribución después de instalar el paquete.
nedned
121

En una nueva imagen de Debian, clona https://github.com/python/cpython y ejecuta:

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

Ahora ejecute el configurearchivo clonado arriba:

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

Tengo 3.7 instalado y funcionando para mí.

LIGERA ACTUALIZACIÓN

Parece que dije que actualizaría esta respuesta con una explicación más y dos años después no tengo mucho que agregar.

Aparte de eso, supongo que la opción sería leer el código base de cpython en busca de #includedirectivas que deban cumplirse, pero lo que suelo hacer es seguir intentando instalar el paquete y seguir leyendo la salida instalando los paquetes necesarios hasta que tiene éxito.

Me recuerda la historia del ingeniero, el gerente y el programador cuyo automóvil rueda cuesta abajo .

MikeiLL
fuente
3
Fantástico. Ahora, ¿puede decirme cómo obtuvo la lista anterior? ¿Por prueba y error? : -O
Veky
4
Honestamente, @Veky hice una búsqueda en la web del error, "ImportError: No module named '_ctypes'" y cavé, probablemente intenté algunas cosas antes de que funcionara. Actualizaré la respuesta para aclarar mi escasa comprensión de APT, Python, make, etc.
MikeiLL
Debería ser en python3-devlugar de python-dev. python-devparece para python2.
Timo
¿Por qué clonarías un repositorio de código fuente y luego lo usarías sudo apt-get? Eso simplemente no tiene ningún sentido. sudo apt-getmaneja la descarga de código ya compilado, entonces, ¿por qué descarga el código y luego no lo usa?
Ryan
1
@MikeiLL Me di cuenta de que todas las sudodeclaraciones son requisitos previos de instalación para poder construir el código fuente que descargaste. the ./configureand makestuff requiere que esas cosas estén instaladas.
Ryan
29

Si usa pyenv y obtiene el error "Ningún módulo llamado '_ctypes'" (como yo) en Debian / Raspbian / Ubuntu, debe ejecutar estos comandos:

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

Pon tu versión de Python en lugar de 3.7.6

Evgeniy
fuente
Bienvenido a stack overflow. ¿Puede proporcionar más información? Referencias, etc. y eche un vistazo a stackoverflow.com/help/how-to-answer
Nodejs-nerd
Gracias por la respuesta, el más votado tenía la lista completa que probablemente necesitaba, pero esto me recordó que debía reinstalar a través pyenvde para que las cosas realmente funcionen. Usar pyenv es mucho más fácil que tomar el código fuente y hacer todas las makecosas con seguridad.
dragon788
Esto funcionó para mí en Ubuntu. Simple y eficaz.
Phil
Gracias, eso fue útil. Para obtener una lista completa de los requisitos previos para pyenv, visite github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites
Paweł Mucha
No es necesario desinstalar Python primero. Con solo instalarlo de nuevo, se recompilará el binario de Python y eso es lo que se necesita.
RusI
22

Pasos detallados para instalar Python 3.7 en CentOS o cualquier máquina linux redhat:

  1. Descargue Python desde https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
  2. Extraiga el contenido en una carpeta nueva
  3. Abra Terminal en el mismo directorio
  4. Ejecute el siguiente código paso a paso:
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
fuente
14

Pensé que agregaría las instalaciones de Centos:

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

Verifique la versión de Python:

python3 -V

Crea virtualenv:

virtualenv -p python3 venv

SE Furgeson
fuente
2
esto se marcó como de baja calidad y lo estoy viendo en la cola de revisión. realmente no funciona como una respuesta independiente. Voy a recomendar la eliminación, pero ¿tal vez puedas mejorarlo expandiéndolo?
dbliss
11

Me encuentro con este error cuando he intentado instalar Python 3.7.3 en Ubuntu 18.04 con el siguiente comando: $ pyenv install 3.7.3. La instalación se realizó correctamente después de la ejecución $ sudo apt-get update && sudo apt-get install libffi-dev(como se sugiere aquí ). Allí se solucionó el problema .

akpp
fuente
6

Ninguna solución funcionó. Tienes que volver a compilar tu python; una vez que todos los paquetes necesarios estuvieran completamente instalados.

Sigue esto:

  1. Instalar paquetes requeridos
  2. correr ./configure --enable-optimizations

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

Arash Mohammadi
fuente
2
Gran respuesta en realidad. Todo el mundo menciona que necesita libffi-devel y que lo solucionaría, el problema es que también necesita volver a compilar Python. Tampoco me rendí con libffi.
Aleksander Fular
3

Consulte este hilo , para la instalación personalizada de libffi, es difícil para Python3.7 encontrar la ubicación de la biblioteca de libffi. Un método alternativo es establecer la CONFIGURE_LDFLAGSvariable en el Makefile, por ejemplo CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64".

pengchy
fuente
El vínculo está roto. Intenté hacer la modificación en el Makefile como se muestra aquí, pero no funcionó. _ctypes todavía no se está construyendo.
user5915738
2

Mi solución: instalar libffi-dev con apt-get no ayudó. Pero esto ayudó: instalar libffi desde la fuente y luego instalar Python 3.8 desde la fuente.

Mi configuración: Ubuntu 16.04 LTS Python 3.8.2

Paso a paso:

Recibí el mensaje de error "ModuleNotFoundError: Ningún módulo llamado '_ctypes'" al iniciar el depurador desde Visual Studio Code y al ejecutarlo python3 -c "import sklearn; sklearn.show_versions()".

  • descargue libffi v3.3 de https://github.com/libffi/libffi/releases
  • instalar libtool: sudo apt-get install libtool El archivo README.md de libffi menciona que autoconf y automake también son necesarios. Ya estaban instalados en mi sistema.
  • configurar libffi sin documentos:

./configure --disable-docs

make check

sudo make install

Después de eso, mi instalación de Python pudo encontrar _ctypes.

Rolf Kampffmeyer
fuente
2

Esto me resolvió el mismo error en Debian :

sudo apt-get install libffi-dev

y compila de nuevo

Referencia: issue31652

hassanzadeh.sd
fuente
0

Si no le importa usar Miniconda , las bibliotecas externas necesarias y _ctypes se instalan de forma predeterminada. Toma más espacio y puede requerir el uso de una versión moderadamente anterior de Python (por ejemplo, 3.7.6 en lugar de 3.8.2 al momento de escribir este artículo).

Christopher Bottoms
fuente
0

Tiene que cargar los módulos php3 (Python3) que faltan desde el administrador de paquetes. Si tienes Ubuntu te recomiendo Synaptic Package Manager:

sudo apt-get install synaptic

Allí puede simplemente buscar los módulos que faltan. busque ctypes e instale todos los paquetes. Luego ve a tu directorio de Python y haz

./configure
make install.

Esto debería solucionar tu problema.

AnthonyS
fuente
0

Estaba teniendo el mismo problema. Ninguna de las soluciones anteriores funcionó para mí. El desafío clave fue que no tenía acceso de root. Entonces, primero descargo la fuente de libffi. Luego lo compilé con los comandos habituales:

./configure --prefix=desired_installation_path_to_libffi
make 

Luego recompillé Python usando

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

En mi caso, 'home / user123 / Softwares / library / libffi / installation / lib64' es la ruta al directorio de instalación de LIBFFI donde se encuentra libffi.so. Y, / home / user123 / Softwares / Python / installation3 / es la ruta al directorio de instalación de Python. Modifíquelos según su caso.

Bhanuday Sharma
fuente
-1

Si estás haciendo algo, nadie aquí te escuchará porque "lo estás haciendo de la manera incorrecta", pero tienes que hacerlo "de la manera incorrecta" por razones demasiado estúpidas (por ejemplo, en mi caso, rápidamente se degrada en palabras sobre alguien de la madre con sobrepeso del equipo devops), primero debes:

Obtenga libffi e instálelo en su área de instalación de usuario de la forma habitual.

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

Luego regrese a su fuente de Python 3 y encuentre esta parte del código en setup.py en el nivel superior del directorio de fuentes de 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

y agregue la línea que he marcado arriba con el comentario. Por qué es necesario y por qué no hay forma de configurar para respetar '--without-system-ffi` en plataformas Linux, tal vez descubra por qué eso no es "compatible" en las próximas horas, pero todo ha trabajado desde entonces. De lo contrario, mucha suerte ... YMMV.

QUÉ HACE: simplemente anula la lógica allí y hace que el comando de enlace del compilador agregue "-lffi", que es todo lo que realmente necesita. Si tiene la biblioteca instalada por el usuario, probablemente esté detectando bien los encabezados siempre que PKG_CONFIG_PATHincluya path/to/your/install/root/lib/pkgconfig.

Slowkoni
fuente