From: Anton M. <am...@ab...> - 2019-11-11 17:58:31
|
Hello, Barry. Thanks for reply. I am not going to argue about the PyCXX libs and RTTI, to build PyCXX with VS I have to include in my project anyway reference to "c:\Python37\libs" folder, and the prebuild "python37.lib", so far I didn't had issues. Let me get introduced a little more with PyCXX so to be able to understand your answer... Best Regards >-------- Оригинално писмо -------- >От: Barry Scott ba...@ba... >Относно: Re: export with PyCXX >До: PyCXX and improvement >Изпратено на: 10.11.2019 14:30 On 9 Nov 2019, at 20:18, Anton Milev < am...@ab... > wrote: Hello, Bary. Thanks! I will risk to ask for some improvements even if I do not understand completely PyCXX. I will happy if you answer any of it 1. Can you add a VS2017/19 Step-by-Step demo? I actually started using PyCXX with VS2017 so if you like I can help with this. Sorry I'm not a Visual Studio GUI user. I use the VS C++ from the command line. 2. With VS 2017 I had to search for and add all .cxx files from "C:\PyCXX\Src" (cxx_extensions.cxx,. ...) to the VS project. This is not convenient. Is it possible to create with the build scripts a single lib file and I to include in my project only the libs path (from Linker > General->Additional Library Directories) ? It is not practical to provide as a lib. This is because you have to compile the code with the C++ options that you have chosen for the rest of your project. For example some projects want RTTI and others do not. You might use Python limiter API or not. It is similar to how Python libs are included in VS, you only include and set the link path. 3. I am confused with the demos, simple.cxx is not simple at all and is hard for me to start using it. Simple is relative... What I mean by simple is that its shows the simplest way to create a module, class and function, etc. Please advice me in the following case - I have a C++ class A. It is quite complicated and contains a lot of functions and code. I want to export this class A to Python. Is this the right approach: class OldClass : public Py:: PythonExtension OldClass > Look at Demo/Python3/simple.cxx and follow the pattern of the new_style_class. You are using the older style of classes that is not recommended for new code. { public : OldClass() { } virtual ~OldClass() { } static void init_type( void ) { behaviors().name( "simple.OldClass" ); behaviors().doc( "documentation for OldClass class" ); behaviors().supportGetattr(); add_noargs_method( "func1" ,& OldClass ::func1); add_varargs_method( "func2" ,& OldClass ::func2); add_keyword_method( "func3" ,& OldClass ::func3); behaviors().readyType(); } // override functions from PythonExtension virtual Py:: Object getattr( const char * name ) { return getattr_methods( name ); } Py:: Object func1( void ) { std::cout "func1 Called." std::endl; return Py::None(); } Py:: Object func2( const Py:: Tuple & args ) { std::cout "func2 Called with " args .length() " normal arguments." std::endl; return Py::None(); } private: CppClass m_cpp ; }; 4. I have in my class A many overload operators and I want to use them in Python too. For example: >>> import simple >>> a = simple.OldClass() >>> a.func1() func1 Called. >>> a.func2(5) func2 Called with 1 normal arguments. >>> b = a So far Ok but how to do with PyCXX support the following operators: >>> b += a Traceback (most recent call last): File " ", line 1, in TypeError: unsupported operand type(s) for +=: 'simple.OldClass' and 'simple.OldClass' You have to implement the number_inplace_add. See Demo/Python3/simple.cxx (I just added support for inplace add today. Please get check out the source: svn co https://svn.code.sf.net/p/cxx/code/trunk/CXX >>> c = simple.OldClass() >>> a = b + c Traceback (most recent call last): File " ", line 1, in TypeError: unsupported operand type(s) for +: 'simple.OldClass' and 'simple.OldClass' You have to implement the number_add method. See Demo/Python3/simple.cxx My purpose is to expose and use in Python my C++ class as a new type. I need support for different constructors, like: >>> a = simple..OldClass("a") >>> a = simple..OldClass(5) No problem look at simple.cxx and the c'tor for new_style_class. new_style_class( Py::PythonClassInstance *self, Py::Tuple &args, Py::Dict &kwds ) You can handle args and kwds as you need to implement your API. I hope my questions are not too confusing Barry |