Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf

Dieser Artikel wurde im Online-Mokumokukai der Sapporo C ++ Study Group verfasst. Die Sapporo C ++ Study Group sucht Teilnehmer in der Mokumoku Group. Für weitere Informationen wenden Sie sich bitte an @ignis_fatuus

Überblick

Es ist schwer, alles in C ++ zu machen. Machen Sie es sich zum Teil mit Python leichter. Sie können dies mit Boost.Python tun. Ich habe auch versucht, es mit der Twetter-API zu verwenden.

Background Python ist praktisch. Ich habe eine Situation, in der ich eine GUI-Anwendung mit Python erstellen möchte, aber es gibt ein Problem. Qt- und Python-Bindungsbibliothek.

GUI-Bibliothek Python-Bindungen

Um die GUI mit Python zu verwenden, verwenden Sie die GUI-Bibliothek für C-Sprache oder C ++ wie Qt und Gtk. Der Mechanismus zum Aufrufen dieser Bibliotheken in anderen Sprachen aus Python heißt Bindungen. Qt ist eine sehr bekannte GUI-Bibliothek für C ++, und wenn Sie sie auswählen, verliert sie nicht viel, daher möchte ich sie verwenden. Es gibt Gtk und andere Optionen, aber Qt ist sicher.

Python Qt-Bindungen

Es gibt PyQt und PySide. Verwenden Sie PyQt5, um mit Qt5, der neuesten Version von Qt (Stand 31. März 2016), umzugehen. PyQt5 ist jedoch eine GPL- oder kommerzielle Lizenz, daher möchte ich dies vermeiden. Auf der anderen Seite ist PySide die neueste stabile Release-Version (Stand 31. März 2016). PySide 1.2.4 ist nur mit Qt 4.8 kompatibel. PySide2 scheint Qt5 zu unterstützen, aber im Moment scheint es nicht auf Windows aufzubauen.

Der GUI-Teil erfolgt in C ++.

Wie oben erwähnt, gibt es keine GUI-Bibliothek, die von Python verwendet werden kann und die ich derzeit verstehen kann. Qt ist jedoch ursprünglich eine C ++ - Bibliothek. Wenn Sie es also von Anfang an in C ++ schreiben, können Sie die volle Funktionalität nutzen. Der Versuch, alles in C ++ zu schreiben, ist jedoch sehr ärgerlich. Daher wird der Teil, der in C ++ geschrieben werden muss (in diesem Fall der GUI-Teil), in C ++ geschrieben, und der interne Teil, der nicht viel Leistung erfordert, wird in Python geschrieben. Die Netzwerkkommunikation erfolgt beispielsweise in Python. Denn selbst wenn Sie die Leistung mit C ++ verbessern, gibt es eine Netzwerkverzögerung, sodass es keinen großen Vorteil gibt.

Was in diesem Artikel zu erklären

Erklären Sie, wie Sie Python aus Bo ++ mit Boost.Python aufrufen. Als Beispiel werde ich ein Programm vorstellen, das die Twitter-Timeline erfasst und in C ++ als Standardausgabe ausgibt. Verwenden Sie die Python-Bibliothek tweepy, um die Zeitleiste abzurufen.

Installation

C++、Qt、Python、Boost.Python Wenn es sich um eine Windows Msys2-Umgebung handelt, kann sie mit pacman installiert werden.

$ pacman -S mingw-w64-x86_64-gcc
$ pacman -S mingw-w64-x86_64-qt5
$ pacman -S mingw-w64-x86_64-python3
$ pacman -S mingw-w64-x86_64-gcc

tweepy

$ pip3 install tweepy

Vielleicht brauchte ich so etwas wie `` `python3 -m surepip --default-pip```. Wenn Sie pyvenv, virtualenv usw. verwenden möchten, können Sie es problemlos verwenden.

Python-Skript

Schreiben Sie Python-Code, der von C ++ aufgerufen wird. Der Dateiname lautet `` `embedded.py```.

embed.py


#!/usr/bin/env python3
#vim:fileencoding=utf8
import sys
#Wenn tweepy an einem anderen Ort als üblich installiert ist, z. B. pyvenv oder Anaconda, geben Sie diesen Ort an.
# sys.path.append('C:/Anaconda3/envs/MyEnvironments/Lib/site-packages')

#Holen Sie sich das Token von Twitter.
consumer_key        = "...."  
consumer_secret     = "...."
access_token        = "...."
access_token_secret = "...."

#Informationen zur Verwendung von Tweepy finden Sie in anderen Artikeln und auf offiziellen Websites.
import tweepy
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

#C diese Funktion++Anruf von
def timeline():
   public_tweets = api.home_timeline()
   tweets = [ (tweet.author.name, tweet.text) for tweet in public_tweets ]
   return tweets

Fügen Sie zunächst das Verzeichnis hinzu, in dem tweepy und seine abhängigen Bibliotheken installiert sind. Dies ist erforderlich, wenn Sie Anaconda, Pyvenv usw. verwenden, ist jedoch möglicherweise nicht erforderlich, wenn Sie dies nicht tun. Die zur Verwendung der Twitter-API erforderlichen Token erhalten Sie, indem Sie sich als Entwickler auf der Twitter-Website registrieren und diese beantragen. Ich werde Tweepy nicht besonders erklären. Die zuletzt definierte Zeitleiste ist die Funktion, die aus C ++ aufgerufen werden soll. Dieses Mal wurden der Name des Hochtöners und der Inhalt des Tweets zu einem Taple verarbeitet, und die Liste wurde zurückgegeben, um daraus die Timeline-Daten zu machen.

Bereiten Sie die C ++ - Quelle vor

twitter.cpp


#include<iostream>
#include<string>
#include<fstream>
#include<streambuf>
#include<boost/python.hpp>

#Im Python-Skript(tweet.author.name, tweet.text)Struktur gleich Taple
struct Status {
    std::string name;
    std::string text;
    Status(const boost::python::tuple t) :
        name(boost::python::extract<std::string>(t[0])),
        text(boost::python::extract<std::string>(t[1]))
    { }
};

int main() {
    //Stellen Sie die Umgebungsvariable PYTHONHOME Py ein_Initialize()Rufen Sie vorher an
    //Je nach Umgebung ist dies möglicherweise nicht erforderlich.
    wchar_t python_home[] = L"c:\\msys64\\mingw64"; //In Python2 ist char in Ordnung. wchar für python3_t。
    Py_SetPythonHome(python_home);

    Py_Initialize();
    auto main_mod = boost::python::import("__main__");
    auto main_ns  = main_mod.attr("__dict__");

    // read python script
    std::ifstream ifs("embed.py");
    std::string script((std::istreambuf_iterator<char>(ifs)),
                        std::istreambuf_iterator<char>());
    // execute python script,
    // but not invoke timeline() function (definition only)
    boost::python::exec(script.c_str(), main_ns);

    // call python's timeline function and get the timeline data
    using input_iterator = boost::python::stl_input_iterator<boost::python::tuple>;
    auto timeline_data = main_mod.attr("timeline")();
    input_iterator begin(timeline_data), end;

    std::vector<Status> tweets(begin,end);
    for(auto tweet: tweets) {
        std::cout << tweet.name << ":" << tweet.text << std::endl;
    }
}

Die Zeit für den Mokumokukai ist abgelaufen, deshalb werde ich es kurz erklären. Der erste Punkt ist "wie man Daten von Python empfängt". Dies kann einfach mit Iterator in Boost.Python durchgeführt werden. das ist

    using input_iterator = boost::python::stl_input_iterator<boost::python::tuple>;
    auto timeline_data = main_mod.attr("timeline")();
    input_iterator begin(timeline_data), end;
    std::vector<Status> tweets(begin,end);

Teil von. Es tut mir wirklich leid, aber die Zeit ist hier oben. Bitte lesen Sie die Quelle und raten Sie.

Nachtrag: Hinterlassen Sie nur ein Beispiel für das Bauen

g++ -o twitter.exe twitter.cpp -std=c++14 -I/mingw64/include/python3.5m -lboost_python3-mt -lpython3.5m

Recommended Posts

Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf
Führen Sie Python-Skripte in C # -GUI-Anwendungen aus
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Rufen Sie C von Python mit DragonFFI auf
Rufen Sie popcount von Ruby / Python / C # auf
Löse ABC036 A ~ C mit Python
Löse ABC037 A ~ C mit Python
Rufen Sie C / C ++ von Python auf dem Mac auf
Rufen Sie die c-Sprache von Python aus auf (python.h)
Führen Sie den Python-Interpreter im Skript aus
Generieren Sie eine Klasse aus einer Zeichenfolge in Python
Verwenden Sie Django aus einem lokalen Python-Skript
Generieren Sie mit Python eine C-Sprache aus dem S-Ausdruck
Aufrufbefehle von Python (Windows Edition)
Erstellen Sie eine neue Todoist-Aufgabe aus Python Script
Weiter Python in C-Sprache
"Python Kit", das Python-Skripte von Swift aufruft
Erstellen Sie ein Datum / Uhrzeit-Objekt aus einer Zeichenfolge in Python (Python 3.3).
Ich habe versucht, ein Python 3-Modul in C hinzuzufügen
C-API in Python 3
Führen Sie Python-Skripte in Excel aus (mit xlwings).
C-Sprache zum Sehen und Erinnern Teil 3 Rufen Sie die C-Sprache aus Python auf (Argument) c = a + b
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Empfangen Sie Wörterbuchdaten von Python-Programmen mit AppleScript
Versuchen Sie, Python mit pybind11 in ein C ++ - Programm einzubetten
Ein Memorandum zum Ausführen eines Python-Skripts in einer Bat-Datei
Python zeigt aus der Perspektive eines C-Sprachprogrammierers
Was ist in dieser Variablen (wenn das Python-Skript ausgeführt wird)?
Löse den Atcoder ABC176 (A, B, C, E) in Python
Python-Skript, das eine JSON-Datei aus einer CSV-Datei erstellt
Erweitern Sie Python in C ++ (Boost.NumPy)
Rufen Sie CPLEX von Python aus auf (DO cplex)
Machen Sie einen Screenshot in Python
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
OCR aus PDF in Python
Führen Sie das Illustrator-Skript von Python aus
Binäre Suche in Python / C ++
Erstellen Sie ein Lesezeichen in Python
Rufen Sie Methoden in Python dynamisch auf
Zeichne ein Herz in Python
Ich war nüchtern süchtig danach, awscli von einem in crontab registrierten Python 2.7-Skript aus aufzurufen
Ein Mechanismus zum Aufrufen von Ruby-Methoden aus Python, der in 200 Zeilen ausgeführt werden kann
So schneiden Sie ein Block-Multiple-Array aus einem Multiple-Array in Python
So führen Sie ein Python-Programm in einem Shell-Skript aus
Verwendung der Methode __call__ in der Python-Klasse
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Ruft Makrokonstanten aus der C (++) - Headerdatei (.h) in Python ab
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen
Führen Sie ein mehrzeiliges Skript in einem PDB aus
Rufen Sie Matlab von Python zur Optimierung auf
Führen Sie das Python-Skript aus der Batchdatei aus
Wahrscheinlich in einer Nishiki-Schlange (Originaltitel: Vielleicht in Python)
Schreiben Sie eine Dichotomie in Python
Löse ABC163 A ~ C mit Python
Schreiben Sie einen tabellengesteuerten Test in C.
[Python] Verwalten Sie Funktionen in einer Liste
Berühren Sie Python-Objekte in Elixir
Drücken Sie einen Befehl in Python (Windows)