[C++-sig] Cplusplus-sig Digest, Vol 125, Issue 3

Lewis Evans lewis.evans at bayforest.ai
Wed May 13 09:37:35 EDT 2020


Hello,

I suggest to avoid eval, in main()

instead, after "import test" in main():

funcObj = global["test"].attr("test") // assuming your global["test"] is a
successfully imported module
resultObj = funcObj()

then check resultObj:
as well as extract-and-check, you can query repr/str, and is_none(), and
check attributes __class__ and __class__.__name__

in boost-python say someObject.attr("attributeNameHere")

Best

Lewis




Bayforest Technologies Limited
48 Dover St, Mayfair
London W1S 4FF
work1:  +44 203 968 5167
email: lewis.evans at bayforest.ai
web:    https://bayforest.ai/


On Tue, May 12, 2020 at 5:00 PM <cplusplus-sig-request at python.org> wrote:

> Send Cplusplus-sig mailing list submissions to
>         cplusplus-sig at python.org
>
> To subscribe or unsubscribe via the World Wide Web, visit
>         https://mail.python.org/mailman/listinfo/cplusplus-sig
> or, via email, send a message with subject or body 'help' to
>         cplusplus-sig-request at python.org
>
> You can reach the person managing the list at
>         cplusplus-sig-owner at python.org
>
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of Cplusplus-sig digest..."
>
>
> Today's Topics:
>
>    1. Beginner - How to extract a Python Class that inherits from
>       C++ Class (Carlos Duran)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Tue, 12 May 2020 12:11:36 +0200
> From: Carlos Duran <carlos_wurt at zohomail.eu>
> To: "cplusplus-sig" <cplusplus-sig at python.org>
> Subject: [C++-sig] Beginner - How to extract a Python Class that
>         inherits from C++ Class
> Message-ID:
>         <172085e498d.e3349fd230005.5688831514627266454 at zohomail.eu>
> Content-Type: text/plain; charset="utf-8"
>
> Hi,
>
>
>
> I was being researching the Boost.Python library, this archive and
> stackoverflow but I couldn't find the correct answer.
>
>
>
> I tried the following:
> -First: I created the C++ Class.
> --------------------------------------------------------------------------
>
> user at host ~/ProjectFolder: cat lib/DemiComponent.hpp
>
> #pragma once
>
> #include <boost/python.hpp>
>
>
>
> namespace DemiWu
>
> {
>
> ?? ?class Component
>
> ?? ?{
>
> ?? ??? ?public:
>
> ?? ??? ?Component(){};
>
> ?? ??? ?virtual ~Component(){};
>
> ?? ??? ?virtual void on_create(){};
>
> ?? ?};
>
>
>
> ?? ?class ComponentWrap : public Component, public
> boost::python::wrapper<Component>
>
> ?? ?{
>
> ?? ??? ?public:
>
> ?? ??? ?void empty(){}
>
> ?? ??? ?virtual void on_create()
>
> ?? ??? ?{
>
> ?? ??? ??? ?this->get_override("on_create")();
>
> ?? ??? ?}
>
> ?? ?};
>
>
>
> ?? ?void import_component()
>
> ?? ?{
>
> ?? ??? ?using namespace DemiWu;
>
> ?? ? ?? ?using namespace boost::python;
>
> ?? ??? ?class_<ComponentWrap, boost::noncopyable>("Component")
>
> ?? ??? ??? ?.def("on_create", &Component::on_create,
> &ComponentWrap::empty);
>
>
>
> ?? ?};
>
> };
>
> --------------------------------------------------------------------------
>
>
>
> -Second: I exported to Python
>
> --------------------------------------------------------------------------
>
> user at host ~/ProjectFolder: cat lib/DemiWu.hpp
>
> #pragma once
>
> #include <boost/python.hpp>
>
> #include <DemiComponent.hpp>
>
>
>
> BOOST_PYTHON_MODULE(DemiWu)
>
> {
>
> ?? ?DemiWu::import_component();
>
> }
>
> --------------------------------------------------------------------------
>
> ?cat lib/DemiWu.cpp
>
> #include <DemiWu.hpp>
>
> ---------------------------
>
>
>
> -Third: I used Meson to compile, but I think that is not important. The
> module works on python3 interpreter.
>
> --------------------------------------------------------------------------
>
>
>
> -Fourth: I wrote a Python Class that inherit form the C++ Class
> DemiWu::Component.
>
> --------------------------------------------------------------------------
>
> user at host ~/ProjectFolder: cat build/test.py
>
> import DemiWu
>
>
>
> class test(DemiWu.Component):
>
> ??? def __init__(self):
>
> ??????? self.x = 10;
>
> ??????? self.y = 20;
>
>
>
> ??? def on_create(self):
>
> ??????? print("(",self.x, ",",self.y,")", sep="")
>
> ??????? self.x = self.x + 1
>
> ??????? self.y = self.y + 1
>
> --------------------------------------------------------------------------
>
>
>
> Fifth: I write a program that extracts the test Python Class.
>
> --------------------------------------------------------------------------
>
> user at host ~/ProjectFolder: cat src/DemiWu.cpp
>
> #include <boost/python.hpp>
>
> #include <DemiComponent.hpp>
>
> #include <DemiWu.hpp>
>
> #include <iostream>
>
> using namespace boost::python;
>
> using namespace DemiWu;
>
>
>
> int main()
>
> {
>
> ?? ?PyImport_AppendInittab("DemiWu", PyInit_DemiWu);
>
> ?? ?Py_Initialize();
>
> ?? ?object main = import("__main__");
>
> ?? ??? ?object global = main.attr("__dict__");
>
> ?? ?PySys_SetPath(L".");
>
> ?? ?global["test"] = import("test");
>
> ?? ?object obj = eval("test.test()", global);
>
> ?? ?extract<Component*> ex(obj);
>
> ?? ?if(ex.check()){
>
> ??? ??? ?Component* b=ex();
>
> ????? ?? b->on_create();?
>
> ?? ??? ? std::cout << "SUCCESS\n";
>
> ?? ??? ? return 0;
>
> ?? ?} else {
>
> ?? ??? ?std::cout << "FAIL\n";
>
> ?? ??? ?return 1;
>
> ?? ?}
>
> }
>
> --------------------------------------------------------------------------
>
>
>
> Sixth: Compile the program successfully.
>
> --------------------------------------------------------------------------
>
>
>
> Seventh: Execute and... the output is always "FAIL".
>
> --------------------------------------------------------------------------
>
>
>
> How can I fix it? What did I miss?
>
>
>
> Thank you for your attention,
>
>
>
> Carlos
>
>
>
> PS: Sorry for the format of the mail, but I can't express on English well.
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <
> http://mail.python.org/pipermail/cplusplus-sig/attachments/20200512/ef615230/attachment-0001.html
> >
>
> ------------------------------
>
> Subject: Digest Footer
>
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> https://mail.python.org/mailman/listinfo/cplusplus-sig
>
>
> ------------------------------
>
> End of Cplusplus-sig Digest, Vol 125, Issue 3
> *********************************************
>

-- 


Bayforest Capital Limited ( Bayforest®) is an Appointed Representative of 
G10 Capital Limited. G10 Capital Limited is authorised and regulated by the 
Financial Conduct Authority, registration number 648953.





The 
information
contained in this transmission may contain privileged and 
confidential
information.  It is intended only for the
use of the person(s) 
named above.  If you
are not the intended recipient, you are hereby 
notified that any review,
dissemination, distribution or duplication of 
this communication is strictly
prohibited.  This communication is for

information purposes only and should not be regarded as an offer to sell or 
as
a solicitation of an offer to buy any financial product, an official 
confirmation
of any transaction, or as an official statement of Bayforest 
Capital Limited
and Bayforest Technologies Limited.  If
you are not the 
intended recipient, please contact the sender by replying to
this e-mail 
and destroy all copies of this e-mail (and any attachment(s)) from
your 
system.  To reply to our e-mail
administrator directly, please send an 
e-mail to admin at bayforest.ai <mailto:admin at bayforest.ai>.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20200513/d7e9a601/attachment.html>


More information about the Cplusplus-sig mailing list