| Store | Cart

Re: [C++-sig] Boost Python Question - Multiple Classes and Modules not appearing as attribute

From: Jon Lederman <jonl...@gmail.com>
Thu, 8 Sep 2016 19:38:54 -0400
Hi,

I think this text on this page:   https://www.preney.ca/paul/archives/107  relates to the issue I’m having:

It is very important that "libyay" in BOOST_PYTHON_MODULE(libyay) matches the name of the library you're generating in CMakeLists.txt (without the extension).

NOTE: On Linux / Unix systems you will need to prefix the name with "lib" as CMake defaults to prepending the file with "lib" as per convention on Linux / Unix systems.

Essentially, the BOOST_PYTHON_MODULE clause exports the "yay" function as the Python symbol name "yay". This will allow you to call the "yay" function from Python later.


> On Sep 8, 2016, at 6:33 PM, Jon Lederman <jonl...@gmail.com> wrote:> > Hi,> > Ok.  I have removed all the opus library dependencies and stripped away much of everything else.  It seems to me that the name of the generated .so has to match the name of the module.  Perhaps I am building incorrectly.  I am using make.> > > > -Jon> > #ifndef OPUS_ENCODER_STRATEGY_H_> #define OPUS_ENCODER_STRATEGY_H_> > #include "memory"> #include <boost/python.hpp>> #include <boost/numpy.hpp>> #include <exception>> #include <memory>> #include <map>> #include <vector>> #include <iostream>> > namespace bp = boost::python;> namespace np = boost::numpy;> > using namespace std;> > > class OpusEncoderStrategy {> > public:> > 	OpusEncoderStrategy(){};> 	~OpusEncoderStrategy(){};> > 	int fs;> 	int channels;> 	int application;> 	int error;> > > };> > > BOOST_PYTHON_MODULE(opus_strategy)> {> 	using namespace boost::python;> > 	class_<OpusEncoderStrategy>("OpusEncoderStrategy", init<const int, const int, const int>());> }> > > #endif>> On Sep 8, 2016, at 6:00 PM, Stefan Seefeld <ste...@seefeld.name> wrote:>> >> Hi Jon,>> >> please remove the dependency on the "opus/*" headers, so we can compile>> the module ourselves and try to reproduce what you are reporting.>> (That's what I meant with "self-contained test".)>> >> >> Thanks,>>       Stefan>> >> On 08.09.2016 17:30, Jon Lederman wrote:>>> Hi,>>> >>> Thanks for responding.  Here is my header file.  I am compiling this to a shared object called opus_strategy.so.  If I set the argument of BOOST_PYTHON_MODULE to opus_encoder_strategy, and compile my .so file to have the name opus_encoder_strategy.so,I can load the boost python module into my python interpreter and see the OpusEncoderStrategy class as an attribute.  >>> >>> However, if I choose other names such as opus_strategy for the argument to BOOST_PYTHON_MODULE, when I load the boost python object it doesn’t appear to have any recognized attributes.  I don’t understand why the name should matter.  As I had noted in my previous email, I would like to have a shared object file with the name opus_strategy.so that encompasses a set of classes.  Just can’t figure out how to get it to work.  I am on OS X, BTW if that matters.   >>> >>> Any help would be greatly appreciated.>>> >>> Thanks.>>> >>> -Jon>>> #ifndef OPUS_ENCODER_STRATEGY_H_>>> #define OPUS_ENCODER_STRATEGY_H_>>> >>> >>> >>> >>> >>> #include "memory">>> #include "opus/opus.h">>> #include "opus/opus_defines.h">>> #include "opus/opus_multistream.h">>> #include "opus/opus_types.h">>> >>> #include <boost/python.hpp>>>> #include <boost/numpy.hpp>>>> #include <exception>>>> #include <memory>>>> #include <map>>>> #include <vector>>>> #include <iostream>>>> >>> namespace bp = boost::python;>>> namespace np = boost::numpy;>>> >>> using namespace std;>>> >>> >>> class OpusEncoderStrategy {>>> >>> public:>>> >>> 	OpusEncoderStrategy(const int sample_rate, const int number_channels, const int opus_application);>>> 	~OpusEncoderStrategy();>>> >>> 	opus_int32 encode(const float* pcm, const int frame_size, const unsigned char* data,  opus_int32 max_data_bytes);>>> >>> 	bool setComplexity(const int c);>>> 	int getComplexity();>>> >>> >>> private:>>> >>> 	bool encoderCtl();>>> 	int getPacketDurationBytes();>>> >>> 	>>> >>> 	OpusEncoder* encoder;>>> >>> 	int fs;>>> 	int channels;>>> 	int application;>>> 	int error;>>> >>> >>> };>>> >>> >>> BOOST_PYTHON_MODULE(opus_strategy)>>> {>>> 	using namespace boost::python;>>> >>> >>> 	class_<OpusEncoderStrategy>("OpusEncoderStrategy", init<const int, const int, const int>())>>> 	.def("setComplexity", &OpusEncoderStrategy::setComplexity)>>> 	.def("getComplexity", &OpusEncoderStrategy::getComplexity);>>> }>>> >>> >>> #endif>>>> On Sep 8, 2016, at 4:47 PM, Stefan Seefeld <ste...@seefeld.name> wrote:>>>> >>>> Hi Jon,>>>> >>>> what you are describing makes perfect sense, and should work without>>>> problem. From your description it isn't clear why this isn't working, so>>>> I suggest you put together a self-contained test that doesn't work as>>>> you expect, and send that out so we can have a look. Otherwise we'd have>>>> to guess.>>>> The online docs at http://boostorg.github.io/python/doc/html/index.html>>>> should contain everything you need.>>>> >>>>      Stefan>>>> >>>> -- >>>> >>>>    ...ich hab' noch einen Koffer in Berlin...>>>> >>>> _______________________________________________>>>> Cplusplus-sig mailing list>>>> Cplu...@python.org>>>> https://mail.python.org/mailman/listinfo/cplusplus-sig>>> _______________________________________________>>> Cplusplus-sig mailing list>>> Cplu...@python.org>>> https://mail.python.org/mailman/listinfo/cplusplus-sig>> >> >> -- >> >>     ...ich hab' noch einen Koffer in Berlin...>> >> _______________________________________________>> Cplusplus-sig mailing list>> Cplu...@python.org>> https://mail.python.org/mailman/listinfo/cplusplus-sig> 


_______________________________________________
Cplusplus-sig mailing list
Cplu...@python.org
https://mail.python.org/mailman/listinfo/cplusplus-sig
Recent Messages in this Thread
Jon Lederman Sep 08, 2016 08:29 pm
Stefan Seefeld Sep 08, 2016 08:47 pm
Jon Lederman Sep 08, 2016 09:30 pm
Stefan Seefeld Sep 08, 2016 10:00 pm
Jon Lederman Sep 08, 2016 10:33 pm
Jon Lederman Sep 08, 2016 11:38 pm
Jon Lederman Sep 08, 2016 11:44 pm
Jon Lederman Sep 09, 2016 12:33 am
Holger Joukl Sep 09, 2016 08:07 am
Jon Lederman Sep 09, 2016 01:29 pm
Stefan Seefeld Sep 09, 2016 01:42 pm
Jon Lederman Sep 09, 2016 02:00 pm
Stefan Seefeld Sep 09, 2016 02:12 pm
Messages in this thread