[C++-sig] Boost.Python embedded doubt

Eric Jardim ericjardim at gmail.com
Wed Aug 31 16:31:29 CEST 2005


For QtDesigner integration, I need to embedded Python extended classes 
exposed back to C++. So I started with the tutorial and the
Boost.Pythontest example. The test is ok.

Then I changed the example to my needs, and tryed to load the Qt module. The 
program compile and run, but output:
Traceback (most recent call last):
 File "<string>", line 1, in ?
 File "/u/cwd7/devel/boost/python-qt4-0.0.3rc1/Qt/__init__.py", line 8, in ?
 import dl
ImportError: /g0dv/Bin/Linux/python/lib/python2.3/lib-dynload/dl.so: 
undefined symbol: _Py_NoneStruct

This error happens inside the PyRun_String function. I have commented the 
line of the "ld" module import, and it complain about another symbol. It 
does not look like a "dl" problem, but a linking problem.

Reading the tutorial,
it says: "To be able to use embedding in your programs, they have to be 
linked to both Boost.Python's and Python's static link library."

Is it really necessary to both the libs be static? I then (curiously) tried 
to link with the boost_python library dynamically and it complained about 
another (thrid Py~) symbol.

I am building this app with Qt "qmake". I do not use bjam, because I need 
specific precompiling for Qt (easyly done by qmake). But this should not be 
so complex, shoud it? I am just using simple:
>>> -L/path/to/python/lib/python2.3/config -lpython2.3 -L/path/to/boost/lib 
-lboost_python-static -lutil

Am I missing something? Do I have to do anything else?

The code I am trying is:

> using namespace boost::python;
>  object main_module((
>  handle<>(borrowed(PyImport_AddModule("__main__")))));
>  object main_namespace = main_module.attr("__dict__");
>  // Define the derived class in Python.
>  // (You'll normally want to put this in a .py file.)
>  python::handle<> result(
>  PyRun_String(
>  "import Qt\n"
>  "from Qt.Gui import QPushButton\n"
>  "print QPushButton\n",
>  Py_file_input, main_namespace.ptr(), main_namespace.ptr())
>  );
>  // Result is not needed
>  result.reset();

I also call PyInitialize first.

Thanks for any help,

[Eric Jardim]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20050831/728e2d0e/attachment.htm>

More information about the Cplusplus-sig mailing list