[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.

Zusammenfassung dieses Artikels

Was ist in diesem Artikel zu tun?

--Erstellen Sie einen geeigneten Wert in C / C ++ --Drucken Sie den Wert mit einer Python-Funktion --python-Funktionen geben auch entsprechende Werte zurück --Drucken Sie den von der Python-Funktion zurückgegebenen Wert auch auf der C / C ++ - Seite.

(Die Werte der im Programm verwendeten Variablen haben keine Bedeutung)

Quellcode

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

kompilieren

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

Bitte ändern Sie die Python-Version und den Pfad entsprechend.

Ausführungsergebnis

Platzieren Sie die C / C ++ - und Python-Dateien im selben Verzeichnis und führen Sie sie dort aus (da script.py nur gefunden werden kann, wenn der Python-Pfad festgelegt ist). Im C / C ++ - Quellcode gibt es einen Prozess, um das aktuelle Verzeichnis auf den Python-Pfad festzulegen.

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

Zusammenfassung

Ich habe den in C / C ++ berechneten Wert an die Python-Funktion übergeben und ein Programm erstellt, um die in der Python-Funktion durchgeführte Verarbeitung an C / C ++ zurückzugeben.

Er sagt: "Ich weiß, dass es in Python gute Bibliotheken (Deep Learning usw.) gibt, aber ich schreibe nicht gerne alle Programme in Python" (ich kann nicht mit neuen mithalten ...). Also habe ich es im Grunde genommen in C / C ++ geschrieben und dachte, es wäre schön, die Python-Bibliothek nur bei Bedarf aufrufen zu können.

Ich denke, es gibt bereits ähnliche Seiten, aber um sicherzugehen, dass ich nicht vergesse ...

Recommended Posts

[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.
Verwendung der C-Bibliothek in Python
Verwenden Sie libsixel, um Sixel in Python auszugeben und das Matplotlib-Diagramm an das Terminal auszugeben.
[Mac] Eine supereinfache Möglichkeit, Systembefehle in Python auszuführen und die Ergebnisse auszugeben
Verwendung der Methode __call__ in der Python-Klasse
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Verwendung ist und == in Python
Schreiben Sie ein Skript in Shell und Python, um Sie in Slack zu benachrichtigen, wenn der Vorgang abgeschlossen ist
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
Teilen und Verarbeiten eines Datenrahmens mithilfe der Groupby-Funktion
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
Stellen Sie von Python aus eine Verbindung zu postgreSQL her und verwenden Sie gespeicherte Prozeduren in einer Schleife.
[Python] Verwendung der Aufzählungsfunktion (Indexnummer und Element extrahieren)
Die eval () -Funktion, die eine Zeichenfolge als Ausdruck in Python berechnet
So generieren Sie eine Sequenz in Python und C ++
Holen Sie sich den Aufrufer einer Funktion in Python
[Python] Verwendung von Hash-Funktion und Taple.
[Python] Smasher hat versucht, den Video-Ladevorgang mithilfe eines Generators zu einer Funktion zu machen
Ich möchte den Dateinamen, die Zeilennummer und den Funktionsnamen in Python 3.4 erhalten
[Python] Eine Funktion, die die Breite ausrichtet, indem ein Leerzeichen in Text eingefügt wird, das eine Mischung aus voller und halber Breite ist
So rufen Sie den n-ten größten Wert in Python ab
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Python Gibt die Funktion an, die ausgeführt werden soll, wenn das Programm endet
Führen Sie die Python-Funktion von Powershell aus (wie Sie Argumente übergeben).
Verwendung des in Lobe in Python erlernten Modells
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
So führen Sie einen Befehl mit einem Unterprozess in Python aus
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Ich möchte R-Datensatz mit Python verwenden
Was bedeutet das letzte () in einer Funktion in Python?
Python-Skript, das das Azure-Status-RSS crawlt und an Hipchat sendet
So speichern Sie eine Python-Funktion im Wert eines Wörterbuchs (dict) und rufen die Funktion gemäß dem Schlüssel auf
So testen Sie eine Funktion, die die aktuelle Zeit enthält, mit Freezegun in Python
Hinweise zur Verwendung von StatsModels, die lineare Regression und GLM in Python verwenden können
In Python3.8 und höher kann der inverse Mod mit der integrierten Funktion pow berechnet werden.
Eine Lösung für das Problem, dass Dateien mit [und] nicht in glob.glob () aufgeführt sind
Es ist einfach, SQL mit Python auszuführen und das Ergebnis in Excel auszugeben
So finden Sie das erste Element, das den Kriterien in der Python-Liste entspricht
Ich wollte eine DLL erstellen, um eine in C von Python in ctypes geschriebene Funktion zu verwenden, aber es fiel mir schwer
Der Rückgabewert (Generator) einer Funktion, die endlich und Ausbeute kombiniert, darf nicht direkt an next übergeben werden
Jedi-vim-Verknüpfungsbefehl, mit dem Sie auf die Definitionsquelle und das Definitionsziel in Python verweisen können
Erstellen Sie eine Funktion in Python
Geben Sie "Farn programmgesteuert zeichnen" in den Zeichenprozess in Python ein
Eine Funktion, die iterable in Python in N Teile unterteilt
So starten Sie einen einfachen WEB-Server, der CGI von PHP und Python ausführen kann
Verwenden Sie die Rückruffunktion in Python
"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie ein C ++ - Klassenobjekt an ein Klassenobjekt auf der Python-Seite. Teil ①
[Kleine Geschichte] Eine sorgfältige Maßnahme, wenn Sie vor dem Import in Python eine Funktion ausführen müssen
Ändern Sie das Standardausgabeziel in eine Datei in Python
Ruft den Wert eines bestimmten Schlüssels bis zum angegebenen Index der Wörterbuchliste in Python ab
Eine Geschichte, die es einfach macht, den Wohnbereich mit Elasticsearch und Python abzuschätzen