Appel de scripts Python à partir de Python intégré en C ++ / C ++

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

Aperçu

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.

Bindings Python bibliothèque GUI

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.

Liaisons Python Qt

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.

La partie GUI se fait en C ++.

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.

Que expliquer dans cet article

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.

Installation

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.

Script Python

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

Préparer la source C ++

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

Appel de scripts Python à partir de Python intégré en C ++ / C ++
Exécuter des scripts Python à partir d'applications C # GUI
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Appeler C depuis Python avec DragonFFI
Appeler popcount depuis Ruby / Python / C #
Résoudre ABC036 A ~ C avec Python
Résoudre ABC037 A ~ C avec Python
Appeler C / C ++ depuis Python sur Mac
Appeler le langage C depuis Python (python.h)
Exécuter l'interpréteur Python dans le script
Générer une classe à partir d'une chaîne en Python
Utiliser Django à partir d'un script Python local
Générer un langage C à partir d'une expression S avec Python
Appeler des commandes depuis Python (édition Windows)
Créer une nouvelle tâche Todoist à partir d'un script Python
Next Python en langage C
"Kit Python" qui appelle des scripts Python depuis Swift
Créer un objet datetime à partir d'une chaîne en Python (Python 3.3)
J'ai essayé d'ajouter un module Python 3 en C
API C en Python 3
Exécutez des scripts Python à partir d'Excel (en utilisant xlwings)
Langage C pour voir et se souvenir de la partie 3 Appelez le langage C depuis Python (argument) c = a + b
Essayez de créer un module Python en langage C
Recevez des données de dictionnaire à partir de programmes Python avec AppleScript
Essayez d'incorporer Python dans un programme C ++ avec pybind11
Un mémorandum pour exécuter un script python dans un fichier bat
Points Python du point de vue d'un programmeur en langage C
Que contient cette variable (lorsque le script Python est en cours d'exécution)
Résoudre Atcoder ABC176 (A, B, C, E) en Python
Script Python qui crée un fichier JSON à partir d'un fichier CSV
Étendre python en C ++ (Boost.NumPy)
Appeler CPLEX depuis Python (DO cplex)
Prendre une capture d'écran en Python
Créer une fonction en Python
Créer un dictionnaire en Python
OCR à partir de PDF en Python
Exécutez le script illustrator à partir de python
Recherche binaire en Python / C ++
Créer un bookmarklet en Python
Appeler dynamiquement des méthodes en Python
Dessinez un cœur en Python
J'étais sobrement accro à appeler awscli à partir d'un script Python 2.7 enregistré dans crontab
Un mécanisme pour appeler des méthodes Ruby à partir de Python qui peut être fait en 200 lignes
Comment découper un bloc de plusieurs tableaux à partir d'un multiple en Python
Comment exécuter un programme Python à partir d'un script shell
Comment utiliser la méthode __call__ dans la classe Python
Créons un script qui s'enregistre avec Ideone.com en Python.
Obtenir des constantes de macro à partir du fichier d'en-tête C (++) (.h) en Python
Un ensemble de fichiers de script qui font wordcloud avec Python3
Exécuter un script multiligne dans un PDB
Appelez Matlab depuis Python pour optimiser
Exécuter le script Python à partir du fichier de commandes
Probablement dans un serpent Nishiki (Titre original: Peut-être en Python)
Ecrire une dichotomie en Python
Résoudre ABC163 A ~ C avec Python
Ecrire un test piloté par table en C
[python] Gérer les fonctions dans une liste
Toucher les objets Python d'Elixir
Appuyez sur une commande en Python (Windows)
Obtenir des données de Quandl en Python