[C++-sig] Re: compile errors with embedding example from tutorial
Graeme Lufkin
graeme.lufkin at gmail.com
Thu Jul 1 22:52:17 CEST 2004
On Thu, 1 Jul 2004 20:19:37 +0000 (UTC), Faheem Mitha
<faheem at email.unc.edu> wrote:
>
> > I've had similar problems, and have slogged my way to figuring
> > them out. The tutorial is wrong, at least on gcc 3.2.3.
> > Here's what you want: After calling Py_Initialize(), you should get
> > the Python main namespace object by doing:
> >
> > handle<> main_module(borrowed( PyImport_AddModule("__main__") ));
> > dict main_namespace = extract<dict>(PyModule_GetDict(main_module.get()));
>
> I think this should be main_module.ptr() since main_module is an object.
In my example it's a handle<>, so get() is correct. In Dave's (and
your) examples, it's an object, so ptr() is correct.
> I'm trying with
>
> ******************************************************************************
> #include <boost/python.hpp>
> using namespace boost::python;
>
> void foo()
> {
> Py_Initialize();
>
> object main_module =
> object(handle<>(borrowed(PyImport_AddModule("__main__"))));
>
> dict main_namespace = extract<dict>(PyModule_GetDict(main_module.ptr()));
>
> handle<> unused(PyRun_String("hello = file('hello.txt', 'w')\n"
> "hello.write('Hello world!')\n"
> "hello.close()", Py_file_input,
> main_namespace.ptr(),main_namespace.ptr()));
> Py_Finalize();
> }
>
> BOOST_PYTHON_MODULE(embed)
> {
> def("foo",foo);
> }
> *******************************************************************************
>
> This compiles, but I get the same error as before, namely
>
> NameError: name 'file' is not defined
>
> Does this work correctly for you? I'm wondering if there is some issue
> with my compiler flags. I'm trying to get Boost.Build to work but
> there are some linking problems.
First, your extension module should never call Py_Initialize() or
Py_Finalize(), as Python will already be initialized by the time
you're running methods in it. I think what you want is foo() to be
main(), with no extension module stuff needed. Also, Boost.Python and
Py_Finalize() don't play nice, so never call it (check the list
archive for details, I don't really understand why myself).
Second, yes this compiles and runs correctly for me, after removing
the Py_Initialize and Py_Finalize calls.
Third, you definitely need to use Boost.Build for a few sample
programs before you think about switching back to Makefiles. I share
your frustration at Boost.Build sometimes, but it does a particular
job admirably. I submitted some patches to the docs and the Jamfile
rules a while ago that were aimed at making it easier to use
Boost.Build for extensions and embedded apps. Dave hasn't gotten back
to me yet. (Hint hint)
--
-- Graeme
graeme.lufkin at gmail.com
More information about the Cplusplus-sig
mailing list