Python3: ImportError: aucun module nommé '_ctypes' lors de l'utilisation de Value from module multiprocessing

127

J'utilise Ubuntu et j'ai installé Python 2.7.5 et 3.4.0. En Python 2.7.5, je suis capable d'attribuer avec succès une variable x = Value('i', 2), mais pas en 3.4.0. Je reçois:

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'

Je viens de mettre à jour la version 3.3.2 en installant la source de 3.4.0. Il s'est installé dans /usr/local/lib/python3.4 .

Ai-je mis à jour correctement vers Python 3.4?

J'ai remarqué une chose que Python 3.4 est installé dans usr / local / lib , tandis que Python 3.3.2 est toujours installé dans usr / lib , donc il n'a pas été écrasé.

htc_m8
la source
Il semble que quelque chose se soit encrassé lors de "l'installation de la source de 3.4.0". Qu'est-ce que cela signifie exactement? Cette commande fonctionnait-elle dans 3.3.2?
mechanical_meat
J'ai installé à partir du code source à l'aide de la commande sudo make install. Oui, l'importation de la valeur à partir du multitraitement a fonctionné en 3.3.2
htc_m8
8
_ctypesn'a pas été créé car la libffi-devdépendance n'était pas disponible. Pensez à utiliser le PPA Deadsnakes à la place.
Eryk Sun
11
L'installation de libffi-dev et la réinstallation de python3.4 ont résolu le problème pour moi
htc_m8

Réponses:

229

L'installation libffi-devet la réinstallation de python3.7 ont résolu le problème pour moi.

pour construire proprement py 3.7 libffi-dev est nécessaire, sinon les choses plus tard échoueront

Si vous utilisez RHEL / Fedora:

yum install libffi-devel

ou

sudo dnf install libffi-devel

Si vous utilisez Debian / Ubuntu:

sudo apt-get install libffi-dev
dotbit
la source
35
J'ai installé libffi-devmais
j'obtiens
2
Si vous utilisez Linux, exécutez ldconfigpour charger le nouveau libffi.so. Le but principal de apt-get install libffi-devest d'installer un fichier appelé libffi.soque vous pouvez vérifier par dpkg -L libffi-dev@tushar_ecmc
Ben-xue
15
Notez que si vous avez compilé votre propre distribution Python (par exemple via pyenv install), vous devrez recompiler la distribution après avoir installé le paquet.
neded le
121

Sur une nouvelle image Debian, cloner https://github.com/python/cpython et exécuter:

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

Exécutez maintenant le configurefichier cloné ci-dessus:

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

J'ai installé 3.7 et fonctionne pour moi.

MISE À JOUR LÉGÈRE

On dirait que j'ai dit que je mettrais à jour cette réponse avec quelques explications supplémentaires et deux ans plus tard, je n'ai pas grand chose à ajouter.

  • cet article explique pourquoi certaines bibliothèques comme python-devpeuvent être nécessaires.
  • cet article explique pourquoi on pourrait utiliser l' argument altinstallpar opposition à installdans la commande make .

En dehors de cela, je suppose que le choix serait soit de lire la base de code cpython à la recherche de #includedirectives à respecter, mais ce que je fais habituellement est de continuer à essayer d'installer le package et de continuer à lire la sortie en installant les packages requis jusqu'à ce qu'il réussit.

Cela me rappelle l'histoire de l' ingénieur, du directeur et du programmeur dont la voiture roule sur une colline .

MikeiLL
la source
3
Fantastique. Maintenant, pouvez-vous me dire comment vous avez obtenu la liste ci-dessus? Par essais et erreurs? : -O
Veky
4
Honnêtement, @Veky j'ai fait une recherche sur le Web pour l'erreur, "ImportError: Aucun module nommé '_ctypes'" et j'ai fouillé, j'ai probablement essayé quelques choses avant que cela ne fonctionne. Mettra à jour la réponse pour clarifier avec ma compréhension limitée de APT, Python, make, etc.
MikeiLL
Cela devrait être python3-devau lieu de python-dev. python-devsemble pour python2.
Timo
Pourquoi cloneriez-vous un référentiel de code source, puis l'utiliseriez-vous sudo apt-get? Cela n'a tout simplement aucun sens. sudo apt-getgère le téléchargement du code déjà compilé, alors pourquoi téléchargez-vous le code et ne l'utilisez pas?
Ryan
1
@MikeiLL J'ai réalisé que toutes les sudodéclarations installaient des pré-requis afin d'aller construire le code source que vous avez téléchargé. le ./configureet les maketrucs nécessitent que ces éléments soient installés.
Ryan
30

Si vous utilisez pyenv et obtenez l'erreur "Aucun module nommé '_ctypes'" (comme je le suis) sur Debian / Raspbian / Ubuntu, vous devez exécuter ces commandes:

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

Mettez votre version de python au lieu de 3.7.6

Evgeniy
la source
Bienvenue dans le débordement de pile. Pouvez-vous fournir plus d'informations? Références, etc. et jetez un œil à stackoverflow.com/help/how-to-answer
Nodejs-nerd
Merci pour la réponse, le vote le plus élevé avait la liste complète dont j'avais probablement besoin, mais cela m'a rappelé de réinstaller via pyenvafin de faire fonctionner les choses. Utiliser pyenv est bien plus facile que de saisir le code source et de faire tout lemake nécessaire à coup sûr.
dragon788
Cela a fonctionné pour moi sur Ubuntu. Simple et efficace.
Phil
Merci, cela a été utile. Pour obtenir la liste complète des prérequis pour pyenv, visitez github.com/pyenv/pyenv/wiki/Common-build-problems#prerequisites
Paweł Mucha
Vous n'avez pas besoin de désinstaller Python au préalable. Le simple fait de l'installer à nouveau recompilera le binaire Python et c'est ce dont vous avez besoin.
RusI
22

Étapes détaillées pour installer Python 3.7 dans CentOS ou toute machine Linux Redhat:

  1. Téléchargez Python depuis https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
  2. Extraire le contenu dans un nouveau dossier
  3. Ouvrez le terminal dans le même répertoire
  4. Exécutez le code ci-dessous étape par étape:
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
la source
14

Je pensais que j'ajouterais les installations Centos:

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

Vérifiez la version de python:

python3 -V

Créez virtualenv:

virtualenv -p python3 venv

SE Furgeson
la source
2
cela a été signalé comme étant de mauvaise qualité et je le regarde dans la file d'attente d'examen. cela ne fonctionne vraiment pas comme une réponse autonome. Je vais recommander la suppression, mais peut-être pouvez-vous l'améliorer en l'agrandissant?
dbliss
11

Je lance cette erreur quand j'ai essayé d'installer Python 3.7.3 dans Ubuntu 18.04 avec la commande suivante: $ pyenv install 3.7.3. L'installation a réussi après l'exécution $ sudo apt-get update && sudo apt-get install libffi-dev(comme suggéré ici ). Le problème a été résolu là-bas .

akpp
la source
6

Aucune des solutions n'a fonctionné. Vous devez recompiler votre python à nouveau; une fois que tous les packages requis ont été complètement installés.

Suivez ceci:

  1. Installer les packages requis
  2. Courir ./configure --enable-optimizations

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

Arash Mohammadi
la source
2
Excellente réponse en fait. Tout le monde mentionne que vous avez besoin de libffi-devel et que cela le résoudrait, le problème est que vous devez également recompiler python. J'ai déjà abandonné libffi.
Aleksander Fular
3

Reportez-vous à ce fil ou à ce fil , pour une installation personnalisée de libffi, il est difficile pour Python3.7 de trouver l'emplacement de la bibliothèque de libffi. Une autre méthode consiste à définir la CONFIGURE_LDFLAGSvariable dans le Makefile, par exemple CONFIGURE_LDFLAGS="-L/path/to/libffi-3.2.1/lib64".

pingouin
la source
Le lien est rompu. J'ai essayé de faire la modification dans le Makefile comme vous le montrez ici mais cela n'a pas fonctionné. _ctypes ne se construit toujours pas.
user5915738
J'ai ajouté un autre lien de fil.
pengchy
2

Ma solution: installer libffi-dev avec apt-get n'a pas aidé. Mais cela a aidé: installer libffi à partir des sources, puis installer Python 3.8 à partir des sources.

Ma configuration: Ubuntu 16.04 LTS Python 3.8.2

Pas à pas:

J'ai reçu le message d'erreur "ModuleNotFoundError: aucun module nommé '_ctypes'" lors du démarrage du débogueur à partir de Visual Studio Code et lors de l'exécution python3 -c "import sklearn; sklearn.show_versions()".

  • télécharger libffi v3.3 depuis https://github.com/libffi/libffi/releases
  • install libtool: sudo apt-get install libtool Le fichier README.md de libffi mentionne qu'autoconf et automake sont également nécessaires. Ils étaient déjà installés sur mon système.
  • configurer libffi sans documentation:

./configure --disable-docs

make check

sudo make install

Après cela, mon installation python pourrait trouver _ctypes.

Rolf Kampffmeyer
la source
2

Cela a résolu la même erreur pour moi sur Debian :

sudo apt-get install libffi-dev

et compilez à nouveau

Référence: issue31652

hassanzadeh.sd
la source
0

Si cela ne vous dérange pas d'utiliser Miniconda , les bibliothèques externes et _ctypes nécessaires sont installés par défaut. Cela prend plus de place et peut nécessiter l'utilisation d'une version modérément plus ancienne de Python (par exemple 3.7.6 au lieu de 3.8.2 à ce jour).

Christopher Bottoms
la source
0

Vous devez charger les modules php3 (Python3) manquants depuis le gestionnaire de paquets. Si vous avez Ubuntu, je recommande le Synaptic Package Manager:

sudo apt-get install synaptic

Là, vous pouvez simplement rechercher les modules manquants. recherchez des ctypes et installez tous les packages. Ensuite, allez dans votre répertoire Python et faites

./configure
make install.

Cela devrait résoudre votre problème.

AnthonyS
la source
0

J'avais le même problème. Aucune des solutions ci-dessus n'a fonctionné pour moi. Le principal défi était que je n'avais pas l'accès root. Donc, je télécharge d'abord le source de libffi. Ensuite, je l'ai compilé avec les commandes habituelles:

./configure --prefix=desired_installation_path_to_libffi
make 

Ensuite, j'ai recompilé python en utilisant

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

Dans mon cas, 'home / user123 / Softwares / library / libffi / installation / lib64' est le chemin vers le répertoire d'installation de LIBFFI où se trouve libffi.so. Et, / home / user123 / Softwares / Python / installation3 / est le chemin vers le répertoire d'installation de Python. Modifiez-les selon votre cas.

Bhanuday Sharma
la source
-1

Si vous faites quelque chose, personne ici ne vous écoutera parce que "vous le faites dans le mauvais sens", mais vous devez le faire "dans le mauvais sens" pour des raisons trop insignifiantes (par exemple, dans mon cas, cela se dégrade rapidement en faute mots sur quelqu'un sur une mère en surpoids de l'équipe devops), vous devez d'abord:

Obtenez libffi et installez-le dans votre zone d'installation utilisateur de la manière habituelle.

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

Revenez ensuite à votre source Python 3 et trouvez cette partie du code dans setup.py au niveau supérieur du répertoire source 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

et ajoutez la ligne que j'ai marquée ci-dessus avec le commentaire. Pourquoi c'est nécessaire, et pourquoi il n'y a aucun moyen de faire en sorte que la configuration respecte '--without-system-ffi' sur les plates-formes Linux, peut-être découvrirai-je pourquoi cela n'est "pas pris en charge" dans les prochaines heures, mais tout a travaillé depuis. Sinon, bonne chance ... YMMV.

CE QUE CELA FAIT: remplace simplement la logique là-bas et oblige la commande de liaison du compilateur à ajouter "-lffi" qui est tout ce dont elle a vraiment besoin. Si la bibliothèque est installée par l'utilisateur, elle détecte probablement bien les en-têtes tant que votre PKG_CONFIG_PATHinclut path/to/your/install/root/lib/pkgconfig.

slowkoni
la source