J'essaie d'exécuter un script python à partir de C++ en appelant popen().
Le code important ressemble à ceci:
ostringstream command;
command<<"cd ; python3 piap.py "<<u<<" "<<rho;
if(!(in = popen(command.str().c_str(), "r"))){
cout<<"some problem with the subprocess"<<endl;
}
J'ai aussi essayé d'appeler python3.5
dans popen
mais cela ne change rien.
Vous pouvez trouver le fichier cpp complet ici: http://Pastebin.com/KeXsgzjx Mais le reste ne concerne que le passe-partout spécifique au problème.
Le code est parfaitement compilé, mais lors de l'exécution, il génère le message d'erreur suivant:
Erreur fatale Python: Py_Initialize: impossible d'obtenir le codage des paramètres régionaux
Fichier "/home/lhk/programs/clion-2016.1.2/bin/gdb/lib/python2.7/encodings/init .py ", ligne 123 déclenche CodecRegistryError,\^ SyntaxError: syntaxe non valideUnité d'exécution actuelle 0x00007ffff7fd1700 (l'appel le plus récent en premier): Aborted (Core Dumped)
Il y a des doublons de cette question:
Bash tente d'exécuter python sur une commande inconnue et échoue dans Py_Initialize
Malheureusement, les solutions ne fonctionnent pas pour moi:
#!/usr/bin/python3.5
/usr/lib/command-not-found
appelle explicitement /usr/bin/python3
Et il y a encore plus à ce bogue.
J'ai vérifié quelle version de python était configurée par défaut dans Clion, sa version 3.5 et l'interpréteur correct également.
Je suis perdu, pourquoi choisir le mauvais interprète?
J'ai un problème similaire dans contexte différent (lors de l'appel d'un script python3 à partir de l'environnement interactif du programme de tracé VisIt ). Cela s’explique par le fait qu’apparemment, les variables d’environnement (en particulier PATH
) sont définies sur des valeurs locales qui désactivent l’installation de Python3 à l’échelle du système.
Vous pouvez contourner ce problème en exécutant Python 3 dans un table blanche env
. Devrait ressembler à ceci:
ostringstream command;
command<<"cd ; env -i bash -l -c 'python3 piap.py "<<u<<" "<<rho<<"'";
if(!(in = popen(command.str().c_str(), "r"))){
cout<<"some problem with the subprocess"<<endl;
}