为什么不是';将python嵌入C++;应用

为什么不是';将python嵌入C++;应用,python,c++,Python,C++,我问过这个问题,但显然这个问题比我想象的更一般地与python相关。奇怪的是,我在这个问题上找不到太多的话题 基本上,我在base.py中有一个基类: class B: def __init__(self): ... def func(self): ... 和child.py中的子类: from base import B class C(B): def __init__(self): B.__init__(self)

我问过这个问题,但显然这个问题比我想象的更一般地与python相关。奇怪的是,我在这个问题上找不到太多的话题

基本上,我在base.py中有一个基类:

class B:
   def __init__(self):
       ...
   def func(self):
       ...
和child.py中的子类:

from base import B

class C(B):
   def __init__(self):
       B.__init__(self)
       ...
   def func(self):
       B.func(self)
       ...
如果我创建这些类并纯粹通过Python调用它们,那么一切都很好。但是,当我尝试通过C API执行此操作时,C.func()无法调用B.func()。这就好像C.func()完全忽略了我调用
B.func(self)
的那一行

我通过C API将base.py和child.py的内容加载到字符串中来定义这些类。这是通过Qt通过loadFromFile例程完成的,我相信这是正确的。然后,我通过一个包装
PyRun\u SimpleString
的函数调用为每个类加载的代码:

bool PythonAPI::runCode(const std::string& code)
{
    int ran = PyRun_SimpleString(code.c_str());
    if (ran < 0) {
        printErrors();
        return false;
    }
    return true;
}
API的工作方式是否有任何奇怪之处,可能导致这种情况?我调用类实例的方法(减去错误处理)的例程如下所示:

PyObject * PythonAPI::call(PyObject * instance, const std::string& methodName, PyObject * args)
{
    // Obtain pointer to function
    PyObject* method = PyObject_GetAttrString(instance, methodName.c_str());

    // Call function
    PyObject* output = PyObject_CallObject(method, args);

    // Decrement count for function, ignoring if it is null
    Py_XDECREF(method);

    return output;
}
我希望我的应用程序的用户纯粹通过Python进行接口,这就是为什么我希望将他们需要的所有东西打包到类B中,他们可以从类B继承。谢谢


编辑:经过大量调查,当B类和C类在同一个文件中时,继承似乎可以正常工作。但是,由于项目的限制,我需要将类B放在它自己的文件中,所以我不能使用这种变通方法。我不确定这为什么会引起问题。

什么是
o
?我在这里看不到足够的信息来诊断问题。这里有一些东西没有意义,也有一些东西缺失,总的来说,看起来你试图简化事情(这很好),但不知道如何正确地做到这一点(这是你应该努力学习的技能),给我们留下的东西与您的代码只有模糊的相似之处,而不是它需要的方式。在构建代码的简化版本时,结果需要是可运行的,并且需要在运行时重现错误,而不需要任何隐藏的上下文。查看您在SourceForge上发布的内容,我怀疑您可能在Python 2上,在Python 2上,类的默认行为不同,0参数
super
不是问题。你在SourceForge上发布的代码使用了0-argument
super
。你好@user2357112支持Monica,我把这个问题放在一起有点太随意了,对此表示抱歉。我在另一个论坛帖子中的内容更为广泛,但我对这个问题进行了编辑,所以我的过程应该更加清晰。此外,我使用的是python 3.8,现在对父类进行显式调用,而不是使用super()。仍然没有骰子。好吧,新版本仍然无法运行,但它提出了它自己的一套全新的问题。您发布的模块处理方式毫无意义。看起来您是在
\uuuu main\uuuu
的上下文中运行所有内容,而不是实际导入模块。你知道你可以在Python C API中导入模块吗?
PyObject * PythonAPI::call(PyObject * instance, const std::string& methodName, PyObject * args)
{
    // Obtain pointer to function
    PyObject* method = PyObject_GetAttrString(instance, methodName.c_str());

    // Call function
    PyObject* output = PyObject_CallObject(method, args);

    // Decrement count for function, ignoring if it is null
    Py_XDECREF(method);

    return output;
}