[C++-sig] How to get output from python embedded in VC++
Jian
thecolors at 126.com
Fri Jul 21 23:17:29 EDT 2017
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.horvath at 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 at python.org
>> https://mail.python.org/mailman/listinfo/cplusplus-sig
>
>
>_______________________________________________
>Cplusplus-sig mailing list
>Cplusplus-sig at python.org
>https://mail.python.org/mailman/listinfo/cplusplus-sig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20170722/54fa51fd/attachment.html>
More information about the Cplusplus-sig
mailing list