NameError: глобальное имя не определяется с использованием встраивания boost python - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь вызвать метод, определенный в c ++, через python, используя boost python, но получаю эту ошибку:

NameError: global name 'print1' is not defined 

Мой код для определения модуля:

namespace python = boost::python;
class Strat
{
    public:
    virtual int print1()=0;
    virtual std::vector<long long> gen_fibonacci(int in,int n)= 0;
};

class PyStrat final
    : public Strat
    , public bp::wrapper<Strat>
{
    int print1() 
    {
        std::cout<<"Congratulations! I ran"<<"\n";
        return 1;
    }

    std::vector<long long> gen_fibonacci(int in,int n) override
    {
        get_override("gen_fibonacci")();
    }

};


BOOST_PYTHON_MODULE(Strat)
{
    bp::class_<PyStrat, boost::noncopyable>("Strat")
        .def("print1", &Strat::print1)
        ;

    bp::class_<std::vector<long long> >("Long_vec")
        .def(bp::vector_indexing_suite<std::vector<long> >())
    ;


    bp::class_<PyStrat, boost::noncopyable>("Strat")
        .def("gen_fibonacci", &Strat::gen_fibonacci)
        ;
}

И вызов метода print1 () из python:

from Strat import *

class Strategy:
    def gen_fibonacci(self,ind,n):
        print1()
        l=[]
        num = 3
        t1 = 0 
        t2 = 1
        nextTerm = 0
        i=1
        if ind==1:
            l.append(0)
            l.append(1)
            i=3
        if ind==2:
            l.append(1)
            i=2
        while i<n:
            nextTerm=t1+t2
            t1=t2
            t2=nextTerm
            if num>=ind:
                i=i+1
                l.append(nextTerm)
            num=num+1
        return l

Что я делаю не так? Я видел Boost Python - Глобальный и локальный словарь , но он все еще не решен, поэтому я спросил его здесь ....

...