J'essaie de créer une bibliothèque partagée à l'aide d'un fichier d'extension C, mais je dois d'abord générer le fichier de sortie à l'aide de la commande ci-dessous:
gcc -Wall utilsmodule.c -o Utilc
Après avoir exécuté la commande, je reçois le message d'erreur suivant:
utilsmodule.c: 1: 20: erreur fatale: Python.h: aucune compilation de fichiers ou de répertoires de ce type n'est terminée.
en fait, j’ai essayé toutes les solutions suggérées sur Internet, mais le problème existe toujours ... je n’ai également aucun problème avec Python.h
. J'ai réussi à localiser le fichier sur ma machine ... tout le monde a déjà rencontré le même problème ??
J'ai réussi à résoudre ce problème et à générer le fichier .so en une seule commande
gcc -shared -o UtilcS.so
-fPIC -I/usr/include/python2.7 -lpython2.7 utilsmodule.c
On dirait que vous n'avez pas correctement installé les fichiers d'en-tête et les bibliothèques statiques pour python dev. Utilisez votre gestionnaire de paquets pour les installer sur l’ensemble du système.
Pour apt
(buntu, Debian ...):
Sudo apt-get install python-dev # for python2.x installs
Sudo apt-get install python3-dev # for python3.x installs
Pour yum
(CentOS, RHEL ...):
Sudo yum install python-devel # for python2.x installs
Sudo yum install python3-devel # for python3.x installs
Pour dnf
(Fedora ...):
Sudo dnf install python2-devel # for python2.x installs
Sudo dnf install python3-devel # for python3.x installs
Pour zypper
(openSUSE ...):
Sudo zypper in python-devel # for python2.x installs
Sudo zypper in python3-devel # for python3.x installs
Pour apk
(Alpine ...):
# This is a departure from the normal Alpine naming
# scheme, which uses py2- and py3- prefixes
Sudo apk add python2-dev # for python2.x installs
Sudo apk add python3-dev # for python3.x installs
Pour apt-cyg
(Cygwin ...):
apt-cyg install python-devel # for python2.x installs
apt-cyg install python3-devel # for python3.x installs
Sur Ubuntu, j’exécutais Python 3 et j’ai dû installer
Sudo apt-get install python3-dev
Si vous souhaitez utiliser une version de Python qui n'est pas liée à python3, installez le package python3.x-dev associé. Par exemple:
Sudo apt-get install python3.5-dev
Deux choses à faire.
Installez le paquet de développement pour Python. Si vous utilisez Debian/Ubuntu/Mint, utilisez la commande suivante:
Sudo apt-get install python-dev
Deuxièmement, les fichiers d'inclusion ne sont pas inclus par défaut dans le chemin d'inclusion, pas plus que la bibliothèque Python n'est liée à l'exécutable par défaut. Vous devez ajouter ces drapeaux (remplacez la version de Python en conséquence):
-I/usr/include/python2.7 -lpython2.7
En d'autres termes, votre commande de compilation doit être:
gcc -Wall -I/usr/include/python2.7 -lpython2.7 utilsmodule.c -o Utilc
Si vous utilisez un Raspberry Pi:
Sudo apt-get install python-dev
sur Fedora, lancez ceci pour Python 2:
Sudo dnf install python2-devel
et pour Python 3:
Sudo dnf install python3-devel
Si vous utilisez tox pour exécuter des tests sur plusieurs versions de Python, vous devrez peut-être installer les bibliothèques Python dev pour chaque version de Python que vous testez. sur.
Sudo apt-get install python2.6-dev
Sudo apt-get install python2.7-dev
etc.
Vous devez installer le package python2-devel
ou python3-devel
, selon la version Python que vous êtes en utilisant.
Vous pouvez l’installer rapidement à l’aide du 2 bits ou 64 bitssetup.exe
(selon votre installation) de Cygwin.com .
Exemple (modifiez le nom du fichier setup.exe
et la version principale de Python si vous en avez besoin):
$ setup.exe -q --packages=python3-devel
Vous pouvez également consulter mon autre réponse pour quelques options supplémentaires permettant d'installer les packages de Cygwin à partir de la ligne de commande.
Dans AWS API (centOS), son
yum install python27-devel
Pour moi, le changer en ceci a fonctionné:
#include <python2.7/Python.h>
J'ai trouvé le fichier /usr/include/python2.7/Python.h
, et puisque /usr/include
est déjà dans le chemin d'inclusion, alors python2.7/Python.h
devrait suffire.
Vous pouvez également ajouter le chemin d’inclusion à partir de la ligne de commande à la place - gcc -I/usr/lib/python2.7
(merci @ erm3nda).
AWS EC2 installe l'exécution de python34:
Sudo yum install python34-devel
Assurez-vous que les fichiers Python dev sont fournis avec votre système d'exploitation.
Vous ne devriez pas coder en dur la bibliothèque et inclure des chemins. Au lieu de cela, utilisez pkg-config, qui affichera les options correctes pour votre système spécifique:
$ pkg-config --cflags --libs python2 -I/usr/include/python2.7 -lpython2.7
Vous pouvez l'ajouter à votre ligne gcc:
gcc -Wall utilsmodule.c -o Utilc $(pkg-config --cflags --libs python2)
Dans mon cas, Ubuntu a résolu l'installation des paquets libpython-all-dev
(ou libpython3-all-dev
si vous utilisez Python 3).
Ce n'est pas la même situation, mais ça marche aussi pour moi et maintenant je peux utiliser SWIG avec Python3.5:
J'essayais de compiler:
gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/
Avec Python 2.7 fonctionne bien, pas avec ma version 3.5:
existe_wrap.c: 147: 21: erreur fatale: Python.h: aucune compilation ni aucune compilation n'est terminée.
Après avoir exécuté mon installation Ubuntu 16.04:
Sudo apt-get install python3-dev # for python3.x installs
Maintenant je peux compiler sans problèmes Python3.5:
gcc -fPIC -c existe.c existe_wrap.c -I /usr/include/python3.5m/
Si vous utilisez un virtualenv avec un 3.6 python (Edge maintenant), assurez-vous d'installer le pythoncorrespondant _ _ 3.6 dev Sudo apt-get install python3.6-dev
, sinon vous exécuterez Sudo python3-dev
. Installez le python _ dev 3.3.3-1, qui ne résoudra pas le problème.
J'ai également rencontré cette erreur lors de l'installation de coolprop dans Ubuntu.
Pour Ubuntu 16.04 avec python 3.6
Sudo apt-get install python3.6-dev
Si cela ne fonctionne jamais, essayez d'installer/de mettre à jour gcc
lib.
Sudo apt-get install gcc
essayez apt-file. Il est difficile de se rappeler le nom du paquet contenant le fichier manquant. C'est générique et utile pour tous les fichiers de paquets.
Par exemple:
root@ubuntu234:~/auto# apt-file search --regexp '/Python.h$'
pypy-dev: /usr/lib/pypy/include/Python.h
python2.7-dbg: /usr/include/python2.7_d/Python.h
python2.7-dev: /usr/include/python2.7/Python.h
python3.2-dbg: /usr/include/python3.2dmu/Python.h
python3.2-dev: /usr/include/python3.2mu/Python.h
root@ubuntu234:~/auto#
Maintenant, vous pouvez laisser un expert deviner lequel choisir.
Pour les camarades OpenSuse:
Sudo zypper install python3-devel
Pour CentOS 7:
Sudo yum install python36u-devel
J'ai suivi les instructions ici pour installer python3.6 sur plusieurs machines virtuelles: https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a- local-programming-environment-on-centos-7 et a ensuite été en mesure de construire mod_wsgi et de le faire fonctionner avec un serveur virtuel python3.6
Cette erreur s'est produite lorsque j'ai tenté d'installer des unités de configuration sur CentOS 7 avec Python3.6. J'ai fait toutes les astuces mentionnées ici, y compris yum install python34-devel
. Le problème était Python.h
a été trouvé dans /usr/include/python3.4m but not in /usr/include/python3.6m
. J'ai essayé d'utiliser --global-option
pour indiquer d'inclure dir (pip3.6 install --global-option=build_ext --global-option="--include-dirs=/usr/include/python3.4m" ctds
). Cela a abouti à un lpython3.6m
non trouvé lors de la liaison de ctd.
Enfin, ce qui a bien fonctionné a été de corriger l’environnement de développement de Python3.6 et de le corriger à l’inclusion et aux bibliothèques.
yum -y install https://dl.iuscommunity.org/pub/ius/stable/CentOS/7/x86_64/python36u-libs-3.6.3-1.ius.centos7.x86_64.rpm
Python.h doit être dans votre chemin d’inclusion pour gcc. Quelle que soit la version de python utilisée, par exemple s'il s'agit de la version 3.6, elle devrait normalement se trouver dans /usr/include/python3.6m/Python.h
.
Bien sûr, python-dev
ou libpython-all-dev
sont la première chose à faire pour (apt
) install
, mais si cela ne vous aide pas, comme dans mon cas, je vous conseille d'installer le - interface de fonction étrangère paquets par Sudo apt-get install libffi-dev
et Sudo pip install cffi
.
Cela devrait aider surtout si vous voyez l'erreur comme/de c/_cffi_backend.c:2:20: fatal error: Python.h: No such file or directory
.
Il apparaît souvent lorsque vous essayez de supprimer python3.5
et d'installer python3.6
.
Ainsi, lorsque vous utilisez python3
(quel python3 -V
=> python3.6
) pour installer certains packages requis, l'en-tête python3.5
apparaîtra avec cette erreur.
Résoudre par le module install python3.6-dev
.
Pour Python 3.7 et Ubuntu en particulier, il me fallait
Sudo apt install libpython3.7-dev
. Je pense qu'à un moment donné, les noms ont été changés de pythonm.n-dev
à ceci.
Parfois, même après l'installation de python-dev, l'erreur persiste. Recherchez l'erreur si "gcc" est manquant.
Commencez par télécharger comme indiqué dans https://stackoverflow.com/a/21530768/868706 , puis installez gcc
Pour apt (Ubuntu, Debian ...):
Sudo apt-get install gcc
Pour yum (CentOS, RHEL ...):
Sudo yum install gcc
Pour dnf (Fedora ...):
Sudo dnf install gcc
Pour zypper (openSUSE ...):
Sudo zypper in gcc
Pour apk (Alpine ...):
Sudo apk gcc
Si vous utilisez Python 3.6 sur Amazon Linux (basé sur RHEL, mais les réponses RHEL données ici ne fonctionnent pas):
Sudo yum install python36-devel
Vous devez installer les fichiers de développement Python sur votre système d'exploitation si le fichier Python fourni avec votre système d'exploitation ne les accompagne pas. Les nombreuses réponses à cette question montrent les innombrables façons dont cela peut être réalisé sur différents systèmes.
Quand vous l'avez fait, le problème est de dire au compilateur où ils se trouvent et comment compiler. Python est fourni avec un programme appelé python-config
. Pour la compilation, vous avez besoin de la sortie --includes
et pour lier un programme à la bibliothèque Python (incorporant Python dans votre programme) à la sortie --ldflags
. Exemple:
gcc -c mypythonprogram.c $(python3-config --includes)
gcc -o program mypythonprogram.o $(python3-config --ldflags)
Le programme python-config
peut être nommé d'après les versions Python - sous Debian, Ubuntu par exemple, elles peuvent être nommées python3-config
ou python3.6-config
.
Cela signifie que Python.h
ne figure pas dans les chemins d'inclusion par défaut de votre compilateur. L'avez-vous installé à l'échelle du système ou localement? Quel est ton OS?
Vous pouvez utiliser l'indicateur -I<path>
pour spécifier un répertoire supplémentaire dans lequel votre compilateur doit rechercher des en-têtes. Vous devrez probablement faire un suivi avec -L<path>
pour que gcc puisse trouver la bibliothèque avec laquelle vous allez créer un lien en utilisant -l<name>
.