Comment puis-je importer des modules dans boost::python python intégré code?
J'utilise boost::python pour intégrer du code python dans une application. J'ai été en mesure d'obtenir des instructions d'impression ou d'autres expressions à évaluer correctement, mais lorsque j'essaie d'importer des modules, il n'est pas de l'importation et de l'application est sortie. Outre le globals() appel de fonction dans le code intégré donne une erreur d'exécution.
#include <boost/python.hpp>
using namespace boost;
using namespace boost::python;
using namespace boost::python::api;
int main(void) {
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
main_namespace["urllib2"] = import("urllib2");
object ignored = exec(
"print 'time'\n", main_namespace);
}
Ici, j'ai essayé de l'importer urllib2 à l'aide de la poussée de la fonction d'importation, cette compile et s'exécute correctement, mais avec les éléments suivants instruction exec, il donne une erreur.
object ignored = exec(
"print urllib2\n"
"print 'time'\n", main_namespace);
Ou quand j'enlève la poussée de la fonction d'importation et de faire de l'importation de l'intérieur le code embarqué aussi, il donne une erreur. J'ai essayé en utilisant un essai: à l'exception de: bloc mais cela ne fonctionne pas non plus. Est-ce parce que le C++ application n'est pas en mesure de trouver l'emplacement de la urllib2 py module ou quelque chose? Est-il un moyen de définir le chemin d'accès du module avant d'essayer de l'importer?
Cela est construit uniquement à usage interne, de sorte que certains codage en dur des chemins d'accès est acceptable.
Edit: Plus d'infos:
C'est ce qui se passe. J'ai fait un try .. catch et a appelé le PyErr_Print() si jamais il y a une exception, et a obtenu ce que l'erreur tout le temps quand il y a un module importations ou même des appels de fonction. Message d'erreur:
Traceback (most recent call last):
File "<string>", line 1, in <module>
TypeError: 'NoneType' object does not support item assignment
Quelqu'un peut penser à une raison quelconque?
OriginalL'auteur Sahas | 2009-06-02
Vous devez vous connecter pour publier un commentaire.
Si vous ne l'avez pas déjà fait, vous devez
Qui a pris soin de mes problèmes il y a quelques années lors de l'incorporation de boost::python (Python v2.5).
Edit:
Fourré partout dans l'ancien code. Peut-être que cela fait l'affaire:
Sons savez pas que vous devriez vraiment besoin de la
Py_SetProgramName()
, mais j'ai vaguement souvenir de certains de louche là-bas.Oups. Je n'avais pas remarqué le modifier. Je vais essayer ça aussi.
J'ai eu un mystérieux erreur de segmentation lors de l'importation de certaines bibliothèques (comme gzip ou numpy). Puis ce hack permet de résoudre le problème comme un charme:
Py_SetProgramName("");
Py_InitializeEx(0);
Merci @JonasOriginalL'auteur Jonas Byström
Qui n'a pas aidé, mais j'ai trouvé une autre solution à mon problème. Mon code ressemble à ceci:
En tout cas, merci pour la réponse Jonas
Oh. J'ai été totalement malade du C++ sockets bibliothèques. Ils ont besoin de temps pour comprendre, et depuis, je ne suis pas un des ordinateurs des étudiants, je prends plus de temps pour comprendre. J'ai donc créé quelque chose qui se sent comme une asynchrones urllib++ avec le python urllib2 dans le dos. 😀 je sais que cela semble fou. Mais j'ai une solution extrêmement pratique désormais!
Hehe, bon pour vous!
OriginalL'auteur Sahas
J'ai rencontré le même problème que vous, j'ai e un exemple très simple qui en résulte dans le TypeError, et trouvé la réponse dans cette question, qui est de fournir de l'espace de noms à deux reprises, à la fois global et local.
OriginalL'auteur Magnus Österlind