【发布时间】:2022-01-06 10:49:29
【问题描述】:
现在我正致力于将 python 嵌入到更大的 C++ 应用程序中。尽管我不是 python 专家,但我知道使用内置 PyCallable_Check() 我可以检查 python 对象是否实际上是可调用的。从What is a "callable"? 我发现它取决于类中可用的__call__ 方法或具有非空tp_call 成员的类型。
现在困扰我的是,如果我获得某个类的特定全局实例(在 python 脚本中)的对象引用(在 C++ 中),PyCallable_Check() 在检查此引用时给我 0 作为返回,即使我'我实际上可以调用它。由于这是可能的,我想这里有一个 tp_call 成员(因为在我的示例中我没有 __call__ 方法)。
那么我错过了什么?为什么我得到 0 作为回报?
C++ sn-p 示例:
//...
PyObject* pModule = PyImport_Import( PyUnicode_DecodeFSDefault("testfile") );
PyObject* pGlobalObj = PyObject_GetAttrString( pModule, "globalObj" );
int ok = PyCallable_Check(pGlobalObj)
if( !ok )
{
std::cerr << "Not a callable?!" << std::endl;
std::cerr << "PyCallable_Check() gives: " << ok << std::endl;
}
//call class method anyway...
PyObject* pValue = PyObject_CallMethod( pGlobalObj , "add", "(ii)", 45, 55 );
std::cout << "Global object result: " << PyLong_AsLong(pValue) << std::endl;
//...
关注testfile.py:
class TestClass:
def add(self, a, b):
return a + b
globalObj = TestClass()
给出:
>> Not a callable?!
>> PyCallable_Check() gives: 0
>> Global object result: 100
【问题讨论】:
标签: python c++ instance callable python-embedding