À travers la série jusqu'à présent, l'exemple (Note 2) dans scikit-image Bouge comme ça, Modifier le fichier d'entrée, Gérer plusieurs fichiers d'entrée Ecrivez le résultat dans un fichier Utiliser l'interface graphique Lien avec le réseau Améliorer le code et Réutiliser comme module Mesure et profilage du temps de traitement a été affiché.
Une fois que vous l'aurez maîtrisé jusque-là, vous voudrez probablement l'utiliser à partir du langage C / C ++ la prochaine fois.
Donc cette fois, je vais vous présenter comment utiliser Python à partir du langage C / C ++.
Utiliser Python à partir du langage C / C ++
script python avec fonction system () system("python myscript.py"); Ce faisant, Python peut être utilisé à partir du langage C. fp=popen("python myscript.py","r"); En conséquence, vous pouvez recevoir le résultat ainsi que l'exécuter.
Pour le moment, cette méthode peut être réalisée sans difficulté tant que vous pouvez utiliser le langage C.
Les défis de cette méthode: Chaque fois que le processus est exécuté, l'interpréteur python est lancé par le système ou popen, ce qui entraîne une surcharge. De plus, si le script Python à exécuter a besoin de lire le fichier entraîné en préparation du traitement, la surcharge devient très importante.
Documentation standard de Python [Intégration de Python dans d’autres applications] (http://docs.python.jp/2/extending/embedding.html)
Documentation standard Python 5.3. Pure embedding
Le programme sert à exécuter les fonctions dans le script Python.
Cette approche ne génère pas de processus supplémentaires. Vous pouvez passer un argument à la partie Python intégrée et recevoir le résultat.
PyImport_Import(pName) Le nom du module lu Dans cet exemple, nous donnons ici le nom du module python et exécutons les fonctions contenues dans ce module. (Pour être précis, il semble que Python spécifie le nom du module à importer et appelle le module (.py, .pyc, .pyd, etc.) dans le répertoire courant en fonction du paramétrage de son PYTHONPATH. Si vous incluez une structure de répertoire telle que "$ call ../multiply multipliez 3 2" dans l'argument de cet exemple, PyImport_Import () échoue. )
Augmenter le nombre de fonctions incluses dans le module Vous pouvez faire ce qui suit:
.py:intmath.py
def multiply(a,b):
print "Will compute", a, "times", b
c = 0
for i in range(0, a):
c = c + b
return c
def add(a,b):
print "Will compute", a, " plus ", b
return a+b
def div(a,b):
print "Will compute", a, " div ", b
return a/b
Résultat d'exécution
.txt:Résultat d'exécution.txt
>call.exe intmath div 5 2
Will compute 5 div 2
Result of call: 2
2
>call.exe intmath multiply 6 3
Will compute 6 times 3
Result of call: 18
18
>call.exe intmath add 6 3
Will compute 6 plus 3
Result of call: 9
9
>
Cela peut aussi être fait comme ça.
Cet exemple est très dangereux car il ne vérifie pas les valeurs entrées à partir de la ligne de commande.
Vous pouvez convertir des objets Python en structures de données en langage C comme suit: long PyInt_AsLong(PyObject *io) http://docs.python.jp/2/c-api/int.html
double PyFloat_AsDouble(PyObject *pyfloat) http://docs.python.jp/2/c-api/float.html
En l'incorporant de cette manière et en l'utilisant à partir du langage C, il est possible d'éliminer la surcharge de démarrage de l'interpréteur python et de répéter la terminaison avec les fonctions system () et popen (). De plus, il convient de noter Py_Initialize(); pModule = PyImport_Import(pName); Py_Finalize(); Il est également important de vous assurer que vous n'exécutez que lorsque vous en avez vraiment besoin.
effet: Le côté langage C / C ++ a l'avantage que peu importe la façon dont l'implémentation du module Python change, il n'est pas nécessaire de le reconstruire, tant que l'interface du module appelant, de la fonction, de l'argument et de la valeur de retour ne change pas.
J'étudie toujours [Note 1].
Dans l'exemple de programme de 5.3. Pure embedding Puisque les arguments de fonction et les valeurs de retour sont de types entiers, créons un programme qui les remplace simplement par des points flottants.
L'écriture d'un programme intégré nécessite une bonne compréhension de Python et C, et peut nécessiter une obsession pour le faire fonctionner. Il est assez inhabituel d'avoir un programmeur Python capable de maîtriser l'incorporation de Python simplement parce que vous avez un utilisateur Python autour de vous. Alors, écrivons un programme qui a été légèrement réécrit et essayons de l'imiter.
LINK : fatal error LNK1104: cannot open file 'python27_d.lib' Est affiché dans Visual Studio. Comment utiliser python27.lib en mode Release et en mode Debug comme suit stackoverflow C'était écrit.
#ifdef _DEBUG
#undef _DEBUG
#include <Python.h>
#define _DEBUG
#else
#include <Python.h>
#endif
Remarque: lors de l'utilisation de Python intégré, j'ai essayé d'afficher le processus avec le gestionnaire de tâches. Même lorsque j'ai essayé d'exécuter la partie module Python, j'ai pu confirmer que le processus de python.exe n'a pas été créé. Si vous utilisez la commande système ou popen, essayez l'intégration car vous n'aurez pas à répéter le démarrage de Python et les paramètres initiaux dans le script plusieurs fois.
Choses à écrire, etc. Boost.Python C ++ intégré dans Python avec Scipy.Weave Cython Numpy C-API Scipy Python Types and C-Structures
Remarque 1: lorsque vous augmentez le nombre de bibliothèques à lier avec C / C ++, "Cette bibliothèque a besoin de cette bibliothèque, cette bibliothèque a besoin d'une bibliothèque supplémentaire, et si vous ne la liez pas, la partie qui était jusqu'à présent sera construite. Je ne peux même pas le faire. " Cela a tendance à être une situation triste. Dans le cas de l'incorporation de Python dans le langage C / C ++, le lien est écrit ici #include <Python.h> Un module qui contient une ligne de. Cette partie est le pont entre le langage C / C ++ et le langage Python. Le reste du langage Python n'est pas lié. C'est pourquoi vous pouvez donner le nom du module à importer dans l'exemple de programme C en tant qu'argument de ligne de commande. Il suffit d'avoir un interpréteur Python et une gamme de bibliothèques Python installées. "Ce module, ce module et quel module" C'est aussi bien de pouvoir empêcher une augmentation sans fin du nombre d'objets à lier.
Remarque: dans le cas de Visual Studio sous Windows, il est spécifié qu'il ne peut pas être lié si la version du compilateur change. Cela peut être délicat lors de la création d'énormes bibliothèques comme OpenCV. Lors de la génération d'une bibliothèque pour Python à partir de l'extension C / C ++, langage Cython, la version de Visual Studio doit être la même.
Note 2: La raison du choix de l'exemple dans Scikit-image est que cela ne pose pas le problème de "où dois-je obtenir les données nécessaires?" Lors de l'exécution de l'exemple.