Hi Imre,
I tried to use boost.python as you advised. Build boost.python with But I got a error in the import.hpp as below: ------------------------import.hpp start ---------------------------------------- namespace boost { namespace python { object BOOST_PYTHON_DECL import(str name) { // should be 'char const *' but older python versions don't use 'const' yet. char *n = python::extract<char *>(name); python::handle<> module(PyImport_ImportModule(n)); <---here is where the error raised. n is "__main__" return python::object(module); } } // namespace boost::python } // namespace boost ------------------------import.hpp end---------------------------------------- I copied your code and just replaced 'script.py' with the name of my own file. I found the error raised when the code importing module "__main__". That's my first time to use boost.python. Could you help about this issue? Thanks a lot. Best Regards, John. At 2017-07-21 23:13:37, "Horváth Imre István" <imre.i.horv...@gmail.com> wrote: >Hi John! > >If you want to embed python in c++ app and exchange data between c++ and >python, take a look at the boost::python library. >It's also a platform independent solution (my app's target platforms are >windows vs2015 and linux CentOS7). > >You can do something like this: > > using namespace boost::python; > Py_Initialize(); > try { > boost::python::object main_module = >boost::python::import("__main__"); > boost::python::object main_namespace = >main_module.attr("__dict__"); > > boost::python::dict mydata; > mydata["x"] = 5; > mydata["foo"] = boost::python::dict(); > mydata["foo"]["bar1"] = "data1"; > mydata["foo"]["bar2"] = "data2"; > > // you can declare variables in the python namespace from c++ > main_namespace["mydata"] = mydata; > > // in the script there is a mydata variable: {'x': 5, 'foo': >{'bar1': 'data1', 'bar2': 'data2'}} > boost::python::object ignored = exec_file("script.py", >main_namespace, main_namespace); > > // declare a variable named return_value in the script, > // and you can extract it's value to c++ like this > std::wstring output = >extract<std::wstring>(main_namespace["return_value"]); > > } catch( boost::python::error_already_set) { > PyErr_Print(); > } > >(If your python script has some output, don't forget to redirect boost >std::cout etc) > >Best regards: >Imre > > >2017. 07. 20, csütörtök keltezéssel 11.25-kor Jian ezt írta: >> Dear Gurus, >> >> I want to embed python interpreter in my program. What I want is to >> redirect those output to a control such as RICHEDIT which can be >> modified as a output window in my program. So I can write *.py files >> outside of program and invoke it inside program as a script file. In >> order to get information output by the *.py file I need to get the >> stdin&stdout. I have tried some workflow but not perfect. >> >> 1). I have tried use Allocconsle(). But I can only get the output info >> printed by std::out & printf() in the current code. all things which >> are printed by python35.dll are missing. I used print('xxxx') in the >> *.py file to test the output. Those *.py files are OK in command line >> mode. >> >> 2). I also tried to derive class basic_streambuf and overwrite the >> in/out functions. It works only for output from std::out. Text from >> printf() as well as from dlls are missing. >> >> 3). then I tried to use linker settings as below. >> >> #pragma comment( linker, >> "/subsystem:console /entry:wWinMainCRTStartup" ) >> >> A cmd window is created along with the program. everything output from >> current process and dlls are retrieved successfully as I want. But the >> cmd window is not easy to control. >> >> Is there a better way for this purpose? >> >> Thanks in advance for your kind help. >> >> Best Regards, >> >> John. >> >> >> >> >> >> >> _______________________________________________ >> Cplusplus-sig mailing list >> Cplusplus-sig@python.org >> https://mail.python.org/mailman/listinfo/cplusplus-sig > > >_______________________________________________ >Cplusplus-sig mailing list >Cplusplus-sig@python.org >https://mail.python.org/mailman/listinfo/cplusplus-sig
_______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org https://mail.python.org/mailman/listinfo/cplusplus-sig