web-dev-qa-db-fra.com

Peut-on utiliser du code C en Python?

Je sais que Python fournit une API pour que vous puissiez appeler l'interpréteur Python en code C, mais ce que je veux, c'est le contraire).

Mon programme doit utiliser une API C, donc le code doit être écrit en C. Mais je veux aussi empaqueter le programme avec Python. Ce qui signifie que je veux invoquer ces fonctions C ou exécutables en Python. Est-ce possible?

Si je veux que le code C soit une bibliothèque, cela signifie que je l'utilise avec #include et liaison du *.o probablement en Python, comment faire? Est-ce possible? Si j'écris le code C en exécutable, ce qui signifie qu'il devient une commande, puis-je l'invoquer directement dans Python?

De plus, j'ai entendu dire que Python peut être compilé, cela signifie-t-il que nous pouvons exécuter le code sans le fichier source? Les fichiers de sortie sont-ils des fichiers binaires? Est-ce que cela améliore les performances?

40
dspjm

Je veux invoquer ces fonctions C ou exécutables en python. Est-ce possible.

Oui, vous pouvez écrire du code C qui peut être importé dans Python en tant que module. Python appelle ces modules d'extension . Vous pouvez l'invoquer depuis Python directement, un exemple de la documentation :

Code Python

import example
result = example.do_something()

Code C

static PyObject * example(PyObject *self)
{
    // do something
    return Py_BuildValue("i", result);
}

Si je veux que le code C soit une bibliothèque, ce qui signifie que je l'utilise avec #include et le lien du * .o probablement en python, comment le faire ou est-ce possible.

Vous le construisez comme une bibliothèque partagée *. Dll ou *. So Vous pouvez également étudier l'utilisation de distutils pour distribuer votre module.

Si j'écris le code C dans un exécutable, ce qui signifie qu'il devient une commande, puis-je l'invoquer directement dans python?

Si vous écrivez un *. Exe alors vous faites le contraire (en invoquant Python de C ). La méthode que vous choisissez (exe vs bibliothèque partagée) dépend si vous voulez un "programme C avec du Python" ou un "programme Python avec du C ".

En outre, j'ai entendu dire que python peut être compilé, cela signifie-t-il que nous pouvons exécuter le code sans le fichier source? Les fichiers de sortie sont-ils des fichiers binaires? Est-ce que cela améliore les performances?

Python lit *. Py les fichiers et les compile en *. Pyc bytecode fichiers lorsque vous l'exécutez. Le bytecode est ensuite exécuté dans la machine virtuelle Python. Cela signifie "l'exécution du même fichier est plus rapide la deuxième fois car la recompilation de la source en bytecode peut être évitée." (extrait du glossaire Python) Donc, si vous n'avez pas modifié vos fichiers *. py , il exécutera le *. pyc . Vous pouvez distribuer *. pyc sans les fichiers *. py , mais ils ne sont pas chiffrés et peuvent être rétroconçus.

77
Jacqui Gurto

Vous n'avez pas nécessairement besoin de étendre Python (ce qui n'est pas trivial, btw), mais pouvez utiliser une interface de fonction étrangère telle que ctypes.

11
ffriend

Oui, il est possible d'étendre Python avec C/C++.

Jetez un œil à la documentation: Extension Python avec C ou C++

10
Daniel Hepper