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
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.
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.
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.
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.
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.
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.
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.
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