J'ai un script Python et un programme C et j'ai besoin de transmettre de grandes quantités de données du script Python qui appellent plusieurs fois le programme C. À l'heure actuelle, je laisse l'utilisateur choisir entre les transmettre avec un fichier ASCII ou un fichier binaire, mais les deux sont assez lents et inutiles (je veux dire que les fichiers sont utiles si vous souhaitez stocker les données, mais je supprime ces fichiers à la fin de la script). p>
Je me demande ce que je peux utiliser pour rendre cet échange rapide. Écrire les fichiers sur un disque RAM? Si oui, comment puis-je faire cela? P>
J'ai entendu d'appeler des fonctions de la DLL à l'aide de CTYPES, mais je ne sais pas comment compiler mon programme en tant que DLL (j'utilise WXDEVC + sur Windows 7 64).
Ou enveloppez-le, mais je ne sais toujours pas si cela peut fonctionner et s'il est efficace. P>
Les données sont des sommets d'un maillage 3D. P>
Je suis en cours d'exécution dans le script Python dans un autre programme ( Blender (open source) et est appelé plusieurs fois (généralement plus de 500 fois) parce que c'est à l'intérieur d'un cycle. Le script envoie des informations sur les sommets (1 Donc, ce n'est pas interactif, cela ressemble plus à une fonction (mais elle a écrit en C). Le programme Script + C (qui sont des ajouts de mélangeur) que j'écris devraient être multiplate-forme, car il sera redistribué. P>
Le programme est effectivement écrit en C et de Python, je peux connaître l'adresse en mémoire de la structure contenant les données de sommets. Si seulement je sais comment faire cela, il faut mieux passer au programme C uniquement une adresse et de là trouver tous les autres sommets (sont stockés dans la liste). P>
Mais aussi loin que je sache, je ne peux pas accéder à l'espace mémoire d'un autre programme, et je ne sais pas si vous appelez le programme avec des tuyaux ou tout ce qui utilise un nouveau thread ou est exécuté à l'intérieur du script (c'est-à-dire réellement exécuté sous le fil du mélangeur) p>
Voici la source et OS.System code> ne fonctionne pas, les arguments sont trop que le programme C utilise également des fichiers pour renvoyer des données sur Python, mais ceci est beaucoup moins de données. P>
int code> index et 3 coordonnées de flotteur) au programme, et le programme doit renvoyer de nombreux sommets (seulement int index, car je peux trouver les sommets correspondants avec python). p>
Blender / Source / Blender / FakeDNA / DNA_MESHDATA_TYPES.H code> devrait être la définition de la structure p>
4 Réponses :
Si votre système d'exploitation prend en charge, Tipes nommés est une goutte En remplacement des fichiers. p>
Les tuyaux sont le moyen évident d'aller; Si votre programme C accepte la saisie de STDIN, vous pouvez utiliser voici un exemple plus détaillé. Premièrement, un programme C simple qui fait écho STDIN: P> popen code>. Cela ne crée pas de "fil" comme vous le dites dans votre édition; Il crée un nouveau processus em> avec une mémoire séparée:
from instant import inline
c_code = """
[ ... some c code ... ] //see the below page for a more complete example.
"""
c_func = inline(c_code)
J'ai écrit le programme C, je peux changer comment je veux. Alors communiquer quelque chose avec des tuyaux est comme écrire dans le stdin?
Si je vous comprends correctement, oui. Je posterai un exemple au cas où.
Ok, je sousma ton code. Malheureusement, je vais redistribuer le code, donc je préfère utiliser uniquement des bibliothèques standard (j'ai vu que l'instant est une bibliothèque externe). Je vais essayer avec des pipes. Et je vous dérange un peu plus: pensez-vous à faire une bibliothèque partagée et à l'appeler avec CTTPES fonctionnerait aussi bien? BTW vraiment intéressant la chose inine!
Voici une idée légèrement différente des autres: écrivez votre programme C sous forme de module Python. ici est toutes les informations dont vous avez besoin pour le faire. Vous pouvez ensuite transmettre de gros tampons d'avant entre votre code Python et votre code C. p>
Je n'ai jamais été satisfait des réponses de la liaison de Python et C J'ai donc écrit une réponse après une bonne de recherche et de la pensée.
test.c p> sortie2.py p>