Cet article a été rédigé sur le site Mokumokukai en ligne du groupe d'étude Sapporo C ++. Le groupe d'étude Sapporo C ++ recherche des participants au groupe Mokumoku. Pour plus d'informations, veuillez contacter @ignis_fatuus
Il est difficile de tout faire en C ++. Facilitez donc en partie les choses avec Python. Vous pouvez le faire avec Boost.Python. J'ai également essayé de l'utiliser avec l'API Twetter.
Background Python est pratique. J'ai une situation où je veux créer une application GUI avec Python, mais il y a un problème. Bibliothèque de liaison Qt et Python.
Pour utiliser l'interface graphique avec Python, utilisez une bibliothèque graphique pour le langage C ou C ++ telle que Qt ou Gtk. Le mécanisme pour appeler ces bibliothèques dans d'autres langages à partir de Python est appelé liaisons. Qt est une bibliothèque GUI très célèbre pour C ++, et si vous la sélectionnez, elle ne perdra pas grand-chose, donc je veux l'utiliser. Il existe Gtk et d'autres options, mais Qt est sûr.
Il existe PyQt et PySide. Pour gérer Qt5, qui est la dernière version de Qt (au 31 mars 2016), utilisez PyQt5. Cependant, PyQt5 est une licence GPL ou commerciale, je voudrais donc l'éviter. D'autre part, PySide est la dernière version stable (au 31 mars 2016), PySide 1.2.4 n'est compatible qu'avec Qt 4.8. PySide2 semble prendre en charge Qt5, mais pour le moment, il semble ne pas pouvoir s'appuyer sur Windows.
Comme mentionné ci-dessus, il n'y a pas de bibliothèque GUI qui puisse être utilisée à partir de Python et que je peux comprendre pour le moment. Cependant, Qt est à l'origine une bibliothèque C ++, donc si vous l'écrivez en C ++ depuis le début, vous pouvez utiliser toutes ses fonctionnalités. Cependant, essayer de tout écrire en C ++ est très ennuyeux. Par conséquent, la partie qui doit être écrite en C ++ (dans ce cas, la partie GUI) est écrite en C ++, et la partie interne qui ne nécessite pas beaucoup de performances est écrite en Python. Par exemple, la communication réseau se fait en Python. Parce que même si vous améliorez les performances avec C ++, il y a un délai réseau, donc il n'y a pas beaucoup d'avantage.
Expliquez comment appeler Python à partir de C ++ à l'aide de Boost.Python. À titre d'exemple, je présenterai un programme qui acquiert la chronologie Twitter et la génère en sortie standard en C ++. Utilisez la bibliothèque Python tweepy pour obtenir la chronologie.
C++、Qt、Python、Boost.Python S'il s'agit d'un environnement Windows Msys2, il peut être installé avec pacman.
$ 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
Peut-être que j'avais besoin de quelque chose comme `` python3 -m ensurepip --default-pip```. Si vous souhaitez utiliser pyvenv, virtualenv, etc., vous pouvez l'utiliser sans aucun problème.
Écrivez du code Python appelé à partir de C ++. Le nom du fichier est embed.py
.
embed.py
#!/usr/bin/env python3
#vim:fileencoding=utf8
import sys
#Si tweepy est installé dans un emplacement différent de celui habituel, tel que pyvenv ou Anaconda, spécifiez cet emplacement.
# sys.path.append('C:/Anaconda3/envs/MyEnvironments/Lib/site-packages')
#Obtenez le jeton sur Twitter.
consumer_key = "...."
consumer_secret = "...."
access_token = "...."
access_token_secret = "...."
#Pour savoir comment utiliser tweepy, reportez-vous à d'autres articles et sites Web officiels.
import tweepy
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
#C cette fonction++Appel de
def timeline():
public_tweets = api.home_timeline()
tweets = [ (tweet.author.name, tweet.text) for tweet in public_tweets ]
return tweets
Tout d'abord, ajoutez le répertoire dans lequel tweepy et ses bibliothèques dépendantes sont installés. Ceci est nécessaire si vous utilisez Anaconda, pyvenv, etc., mais peut ne pas être nécessaire si vous ne l'êtes pas. Les jetons nécessaires pour utiliser l'API Twitter sont obtenus en s'inscrivant en tant que développeur sur le site Twitter et en postulant. Je n'expliquerai pas tweepy en particulier. La dernière chronologie définie est la fonction à appeler à partir de C ++. Cette fois, le nom du tweeter et le contenu du tweet ont été transformés en un taple, et la liste a été renvoyée pour créer les données de la chronologie.
twitter.cpp
#include<iostream>
#include<string>
#include<fstream>
#include<streambuf>
#include<boost/python.hpp>
#Dans le script Python(tweet.author.name, tweet.text)Structure équivalente au 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() {
//Définir la variable d'environnement PYTHONHOME, Py_Initialize()Appelez avant
//Cela peut ne pas être nécessaire selon l'environnement.
wchar_t python_home[] = L"c:\\msys64\\mingw64"; //En python2, char est très bien. wchar pour 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;
}
}
Le temps pour le Mokumokukai est écoulé, je vais donc l'expliquer brièvement. Le premier point est "comment recevoir des données de Python". Cela peut être facilement fait avec Iterator dans Boost.Python. C'est
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);
Partie de. Je suis vraiment désolé, mais le temps est écoulé. Veuillez lire la source et deviner.
Post-scriptum: Ne laissez qu'un exemple de construction
g++ -o twitter.exe twitter.cpp -std=c++14 -I/mingw64/include/python3.5m -lboost_python3-mt -lpython3.5m
Recommended Posts