[C / C ++] Passez la valeur calculée en C / C ++ à une fonction python pour exécuter le processus et utilisez cette valeur en C / C ++.

Résumé de cet article

--Passez la valeur calculée dans la source C / C ++ à la fonction python et recevez le résultat de l'exécution dans la source C / C ++.

Que faire dans cet article

--Créez une valeur appropriée en C / C ++ --Imprimer la valeur avec une fonction python

(Les valeurs des variables utilisées dans le programme n'ont aucune signification)

Code source

C/C++

main.cpp


#include <iostream>
#include <vector>
#include <Python.h>

bool isCallable(const char *functionName, PyObject *pythonFunc) {
    if (pythonFunc && PyCallable_Check(pythonFunc)) {
        return true;
    } else {
        std::cerr << "Failed to load the function [" << functionName << "]." << std::endl;
        return false;
    }
}

int main(int argc, char *argv[]) {
    const char *pythonFileName = "script"; // The extension (.py) must be removed.
    const char *functionName = "test_func"; // This function must be included in the script.

    Py_Initialize();
    PyObject *sys = PyImport_ImportModule("sys");
    PyObject *path = PyObject_GetAttrString(sys, "path");
    PyList_Append(path, PyString_FromString(".")); // Add the current directory to the python path list since the script file is in there.
    PyRun_SimpleString("import os, sys\n");

    // load the function from the script
    PyObject *pythonName = PyString_FromString(pythonFileName);
    PyObject *pythonModule = PyImport_Import(pythonName);
    Py_DECREF(pythonName);
    PyObject *pythonFunc = PyObject_GetAttrString(pythonModule, functionName);
    if (!isCallable(functionName, pythonFunc))
        exit(-1);


    // Create data which will be passed to the python's function.
    // Because the numbers of the argument is 2, the python's function must receive 2 arguments (see the script file).
    int pythonFuncArgNum = 2;
    PyObject *pythonArgs = PyTuple_New(pythonFuncArgNum);


    // Create the first argument.
    int dataNum = 3;
    int channelNum = 2;
    int measurementNum = 4;
    PyObject *params = PyList_New(3);
    PyList_SET_ITEM(params, 0, PyInt_FromLong(dataNum));
    PyList_SET_ITEM(params, 1, PyInt_FromLong(channelNum));
    PyList_SET_ITEM(params, 2, PyInt_FromLong(measurementNum));
    PyTuple_SetItem(pythonArgs, 0, params); // Set the first argument.


    // Create the second argument.
    PyObject *datas = PyTuple_New(dataNum);
    for (int i = 0; i < dataNum; i++) {
        PyObject *data = PyTuple_New(channelNum);
        PyObject *channel0 = PyList_New(measurementNum);
        PyObject *channel1 = PyList_New(measurementNum);
        for (int j = 0; j < measurementNum; j++) {
            PyList_SET_ITEM(channel0, j, PyFloat_FromDouble(i + j * 2.0));
            PyList_SET_ITEM(channel1, j, PyFloat_FromDouble(i * 2.0 + j * 2.0));
        }
        PyTuple_SetItem(data, 0, channel0);
        PyTuple_SetItem(data, 1, channel1);
        PyTuple_SetItem(datas, i, data);
    }
    PyTuple_SetItem(pythonArgs, 1, datas); // Set the second argument.


    // Call the python's function and print the returned values.
    PyObject *pythonValue = PyObject_CallObject(pythonFunc, pythonArgs);
    Py_DECREF(pythonArgs);
    std::cout << "Print the results returned from the python function in the C++ source code." << std::endl;
    for (int i = 0; i < (int)PyList_Size(pythonValue); i++)
        std::cout << i << " , " << PyFloat_AsDouble(PyList_GetItem(pythonValue, i)) << std::endl;


    return 0;
}

python

script.py


#! /usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import numpy as np

print 'Scripts written in outside of python functions will be called when this script is loaded by the C++ source code.\n'


# The function must have 2 arguments because the C++ source code gives the function 2 arguments.
def test_func(params, datas):
    print 'Start the python function.'

    # Copy the parameters.
    data_num = params[0]
    channel_num = params[1]
    measurement_num = params[2]
    print 'data_num =', data_num, ', channel_num =', channel_num, ', measurement_num =', measurement_num

    # Print the second arguments
    for i in range(data_num):
        for j in range(measurement_num):
            print 'i =', i, ', channel0 =', datas[i][0][j], ', channel1 =', datas[i][1][j]

    # Create a dummy result and return it.
    values = []
    for i in range(data_num):
        values.append(i * 3.0)

    print 'The python function will return an array (vector) data.\n'

    return values

compiler

g++ main.cpp -o call_py_func_from_c -L/usr/lib/python2.7 -lpython2.7 -I/usr/include/python2.7

Veuillez modifier la version et le chemin de Python en conséquence.

Résultat d'exécution

Placez les fichiers C / C ++ et python dans le même répertoire et exécutez-les là-bas (car script.py ne peut être trouvé que si le chemin python est défini). Dans le code source C / C ++, il existe un processus pour définir le répertoire actuel sur le chemin python.

Scripts written in outside of python functions will be called when this script is loaded by the C++ source code.

Start the python function.
data_num = 3 , channel_num = 2 , measurement_num = 4
i = 0 , channel0 = 0.0 , channel1 = 0.0
i = 0 , channel0 = 2.0 , channel1 = 2.0
i = 0 , channel0 = 4.0 , channel1 = 4.0
i = 0 , channel0 = 6.0 , channel1 = 6.0
i = 1 , channel0 = 1.0 , channel1 = 2.0
i = 1 , channel0 = 3.0 , channel1 = 4.0
i = 1 , channel0 = 5.0 , channel1 = 6.0
i = 1 , channel0 = 7.0 , channel1 = 8.0
i = 2 , channel0 = 2.0 , channel1 = 4.0
i = 2 , channel0 = 4.0 , channel1 = 6.0
i = 2 , channel0 = 6.0 , channel1 = 8.0
i = 2 , channel0 = 8.0 , channel1 = 10.0
The python function will return an array (vector) data.

Print the results returned from the python function in the C++ source code.
0 , 0
1 , 3
2 , 6

Résumé

J'ai passé la valeur calculée en C / C ++ à la fonction python et j'ai créé un programme pour renvoyer le traitement effectué dans la fonction python vers C / C ++.

Il dit: "Je sais qu'il existe de bonnes bibliothèques (deep learning, etc.) en python, mais je n'aime pas écrire tous les programmes en python" (je ne peux pas suivre les nouveaux ...). Donc, je l'ai essentiellement écrit en C / C ++ et j'ai pensé que ce serait bien de pouvoir appeler la bibliothèque python uniquement lorsque cela est nécessaire.

Je pense qu'il y a déjà des pages similaires, mais pour être sûr de ne pas oublier ...

Recommended Posts

[C / C ++] Passez la valeur calculée en C / C ++ à une fonction python pour exécuter le processus et utilisez cette valeur en C / C ++.
Comment utiliser la bibliothèque C en Python
Utilisez libsixel pour générer Sixel en Python et générer le graphe Matplotlib vers le terminal.
[Mac] Un moyen très simple d'exécuter des commandes système en Python et de générer les résultats
Comment utiliser la méthode __call__ dans la classe Python
Comment obtenir la dernière (dernière) valeur d'une liste en Python
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Une fonction qui mesure le temps de traitement d'une méthode en python
Comment utiliser is et == en Python
Écrivez un script dans Shell et Python pour vous avertir dans Slack lorsque le processus est terminé
[Python] Le rôle de l'astérisque devant la variable. Divisez la valeur d'entrée et affectez-la à une variable
Comment diviser et traiter une trame de données à l'aide de la fonction groupby
[Python] Explique comment utiliser la fonction range avec un exemple concret
Connectez-vous à postgreSQL depuis Python et utilisez des procédures stockées dans une boucle.
[Python] Comment utiliser la fonction enumerate (extraire le numéro d'index et l'élément)
Fonction Eval () qui calcule une chaîne de caractères comme expression en python
Comment générer une séquence en Python et C ++
Récupérer l'appelant d'une fonction en Python
[Python] Comment utiliser la fonction de hachage et taple.
[Python] Smasher a essayé de faire du processus de chargement de la vidéo une fonction à l'aide d'un générateur
Je veux obtenir le nom du fichier, le numéro de ligne et le nom de la fonction dans Python 3.4
[Python] Une fonction qui aligne la largeur en insérant un espace dans le texte qui est un mélange de pleine largeur et demi-largeur.
Comment récupérer la nième plus grande valeur en Python
Essayez de créer un module Python en langage C
python Spécifie la fonction à exécuter lorsque le programme se termine
Exécuter la fonction Python à partir de Powershell (comment passer des arguments)
Comment utiliser le modèle appris dans Lobe en Python
J'ai senti que j'avais porté le code Python en C ++ 98.
Comment exécuter une commande à l'aide d'un sous-processus en Python
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Je veux utiliser le jeu de données R avec python
Que signifie le dernier () dans une fonction en Python?
Script Python qui explore le flux RSS du statut Azure et le publie sur Hipchat
Comment stocker une fonction Python dans la valeur d'un dictionnaire (dict) et appeler la fonction en fonction de la clé
Comment tester unitaire une fonction contenant l'heure actuelle à l'aide de Freezegun en Python
Remarques sur l'utilisation de StatsModels qui peuvent utiliser la régression linéaire et GLM en python
Dans Python3.8 et versions ultérieures, le mod inverse peut être calculé avec la fonction intégrée pow.
Une solution au problème que les fichiers contenant [et] ne sont pas répertoriés dans glob.glob ()
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel
Comment trouver le premier élément qui correspond aux critères de la liste Python
Je voulais créer une dll pour utiliser une fonction écrite en C à partir de Python dans ctypes, mais j'ai eu du mal
La valeur de retour (générateur) d'une fonction qui combine finally et yield ne doit pas être passée directement à next
Commande de raccourci Jedi-vim qui vous permet de faire référence à la source de la définition et à la destination de la définition en Python
Créer une fonction en Python
Sortie "Dessiner fougère par programmation" dans le processus de dessin en Python
Une fonction qui divise l'itérable en N morceaux en Python
Comment démarrer un serveur WEB simple qui peut exécuter des cgi de php et python
Utiliser la fonction de rappel en Python
Tutoriel "Cython" pour rendre Python explosif: Passez un objet de classe C ++ à un objet de classe côté Python. Partie ①
[Petite histoire] Une mesure minutieuse lorsque vous devez exécuter une fonction avant l'importation en Python
Changer la destination de sortie standard en un fichier en Python
Obtenir la valeur d'une clé spécifique jusqu'à l'index spécifié de la liste de dictionnaires en Python
Une histoire qui facilite l'estimation de la surface habitable à l'aide d'Elasticsearch et de Python