使用PyObject_IsInstance
我的应用程序通过动态加载来嵌入Python。我需要获取正在执行的脚本中的字典里的值。
pFnPyDict_GetItemString *pFGetItemString = NULL;
pFGetItemString = (pFnPyDict_GetItemString *)::GetProcAddress(hModulePython, PyDict_GetItemString);
if (pFGetItemString)
{
PyObject *pGet = pFGetItemString(pLocals, pVar);
if (pGet)
{
//The following code will not work as PyInt_Check is a macro
pFnPyInt_Check *pIsInt = (pFnPyInt_Check *)::GetProcAddress(hModulePython, "PyInt_Check");
if (PyInt_Check(get))
{
}
// There fore i am using PyObject_IsInstance
pFnPyObject_IsInstance *pFIsInstance = (pFnPyObject_IsInstance*)::GetProcAddress(hModulePython, "PyObject_IsInstance");
if (pFIsInstance)
{
int i = pFIsInstance(pGet, (PyObject*)&PyInt_Type); ----> the problem is here. This call fails.
}
}
}
我该如何指定PyObject_IsInstance的第二个参数?在这里,我想检查pGet中的值是否是整数类型。
2 个回答
0
当然,正确的方法是包含头文件,并使用 PyInt_Check()
。
我猜您没有包含Python C API的头文件,是因为您不想使用隐式链接。但这样做让自己变得很麻烦,因为不使用头文件会让事情变得复杂。仅仅包含头文件,并不意味着DLL中的函数会自动链接到您的程序。只有当您实际调用DLL中的某些函数时,这种链接才会发生。
如果您想确保100%不进行隐式链接,只需确保不链接 .lib 文件即可。
0
你是不是只想检查 ints
(整数)呢?如果是这样的话,使用 PyInt_Check
会更好。
补充:这里有一些建议,虽然你没有问,但可能会对你有帮助。:) 你是在用 C 还是 C++ 呢?如果是 C++,可以考虑使用 Boost.Python,而不是 Python 的 C API,这样会简单很多。用 Boost 来暴露函数和类非常容易。