为什么不是';将python嵌入C++;应用
我问过这个问题,但显然这个问题比我想象的更一般地与python相关。奇怪的是,我在这个问题上找不到太多的话题 基本上,我在base.py中有一个基类:为什么不是';将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)
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-argumentsuper
。你好@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;
}