Comment appelez-vous le code Python à partir de code C?
Je veux prolonger un grand projet C avec quelques nouvelles fonctionnalités, mais j'ai vraiment envie de l'écrire en Python. Fondamentalement, je veux l'appeler Python de code C code. Cependant, Python->C wrappers comme RASADE de permettre à l'OPPOSÉ, c'est l'écriture de modules C et appel C de Python.
Je suis en train d'étudier une approche impliquant la CIB ou RPC (je ne me dérange pas d'avoir plusieurs processus); c'est de n'avoir ma pur Python composant exécuter dans un processus séparé (sur la même machine) et ayant mon projet C de communiquer avec elle par l'écriture/la lecture à partir d'une prise (ou unix pipe). mon python composant peut lire/écrire sur socket pour communiquer. C'est qu'une approche raisonnable? Est-il quelque chose de mieux? Comme certains mécanisme RPC?
Merci pour la réponse, loin d' cependant, j'aimerais me concentrer sur CIB les approches fondées, car je veux avoir mon programme Python dans un processus distinct que mon programme C. Je ne veux pas intégrer un interpréteur Python. Merci!
- Quel est votre justification de vouloir mettre le programme en Python dans un processus distinct, et ne voulant pas intégrer un interpréteur Python? Je suis curieux de savoir.
- Eh bien, si il peut obtenir un avec juste de la tuyauterie des chaînes de python, et retour à la C quand il est fait, il semble beaucoup plus simple que d'intégrer un interpréteur python. Simplement en appelant un distinct python application aura besoin de 5 minutes de l'intégration si l'interface est simple (il suffit de passer les cordes et les chaînes) et je suis sûr que l'incorporation d'un interprète va prendre un peu plus de 5 minutes
- Voici un exemple complet stackoverflow.com/a/46441794/5842403 où vous pouvez voir Python embarqué en C, puis C embarqué dans Systemverilog à l'aide de DPI.
Vous devez vous connecter pour publier un commentaire.
Je recommande le approches détaillées ici. Il commence par expliquer comment exécuter des chaînes de code Python, puis à partir de là les détails de comment mettre en place un environnement Python pour interagir avec votre programme C, appel de fonctions Python à partir de votre code en C, manipuler des objets Python à partir de votre code en C, etc.
MODIFIER: Si vous voulez vraiment aller de l'itinéraire de la CIB, alors vous aurez envie d'utiliser le module struct ou, mieux encore, protlib. La plupart des communications entre un Python et C processus repose sur la transmission de structures d'avant en arrière, soit sur une socket ou par l'intermédiaire de de mémoire partagée.
Je vous recommande de créer un
Command
struct avec des champs et des codes pour représenter des commandes et de leurs arguments. Je ne peux pas donner beaucoup de conseils plus spécifiques sans en savoir plus sur ce que vous voulez accomplir, mais en général, je recommande la protlib de la bibliothèque, puisque c'est ce que j'utilise pour communiquer entre le C et le Python programmes (disclaimer: je suis l'auteur de protlib).Voir le chapitre correspondant dans le manuel: http://docs.python.org/extending/
Essentiellement, vous aurez à intégrer l'interpréteur python dans votre programme.
Avez-vous pensé à juste envelopper de votre application python dans un script shell, et l'appelant depuis votre application C?
Pas la solution la plus élégante, mais elle est très simple.
Je n'ai pas utilisé une approche de la CIB pour Python<->C la communication, mais il devrait fonctionner assez bien. Je voudrais avoir le programme C faire un standard fourche-exec et l'utilisation redirigé
stdin
etstdout
dans le processus de l'enfant pour la communication. Un joli texte à base de communication, il est très facile de développer et de tester le programme en Python.Si j'avais décidé d'aller avec l'IPC, je serais probablement faire des folies avec XML-RPC -- croix-plate-forme, vous pouvez facilement mettre le Python projet de serveur sur un autre nœud, plus tard, si vous voulez, a beaucoup d'excellentes implémentations (voir ici pour beaucoup, dont le C et le Python, et ici pour la simple serveur XML-RPC qui est partie de l'Python standard library -- pas comme hautement évolutive que d'autres approches, mais probablement fine et pratique pour votre cas d'utilisation).
Il ne peut pas être parfait CIB approche pour tous les cas (ou même un parfait RPC, par tous les moyens!), mais la commodité, la flexibilité, la robustesse et la large gamme de mises en œuvre dépassent de beaucoup de défauts mineurs, à mon avis.
apparemment Python doivent être en mesure de compiler win32 dll, il permettra de résoudre le problème
De telle manière que la conversion de code c# pour win32 dll de le rendre utilisable par n'importe quel outil de développement
Cela semble tout à fait agréable http://thrift.apache.org/, il y a même un livre sur le sujet.
Détails:
J'ai utilisé le "standard" de l'approche de L'incorporation de Python dans une Autre Application. Mais c'est difficile/pénible. Chaque nouvelle fonction en Python est pénible à mettre en œuvre.
J'ai vu un exemple de L'appel de PyPy de C. Il utilise CFFI pour simplifier l'interface, mais il nécessite PyPy, pas Python. Lire et comprendre cet exemple tout d'abord, au moins à un niveau élevé.
J'ai modifié le C/PyPy exemple fonctionne avec Python. Voici comment appeler Python à partir de C en utilisant CFFI.
Mon exemple est plus compliqué parce que j'ai mis en place trois fonctions en Python au lieu d'un. Je voulais couvrir d'autres aspects de la transmission des données d'avant en arrière.
La partie compliquée est maintenant isolé au passage l'adresse de
api
de Python. Qui n'a qu'à être mise en œuvre une fois. Après cela, il est facile d'ajouter de nouvelles fonctions en Python.interface.h
test_cffi.c
interface.py
Compiler:
Exécuter: