使用PyObject_IsInstan

2024-10-04 09:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我的应用程序通过动态加载来嵌入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中的值是否为int类型


Tags: ifischeckisinstancepyobjectpyintgetitemstringpget
2条回答

您只想检查ints吗?如果是这样,最好使用^{}。在

附加:一些你没有要求但可能对你有帮助的建议。)你使用C还是C++?如果是后者,请考虑使用Boost.Python而不是PythonC API—这会使事情变得简单得多。使用Boost公开函数和类很简单。在

当然,这里正确的方法是包含头文件并使用PyInt_Check()。在

我假设您没有包括pythoncapi头文件,因为您不想使用隐式链接。但是你试图在没有头文件的情况下工作,这让你的生活变得艰难。仅仅因为包含头文件,并不意味着DLL函数将隐式链接到您的程序。只有在实际调用DLL中的一些函数时才会发生这种情况。在

如果你想百分之百确定你没有隐式链接到DLL,那么只需确保你没有链接.lib文件。在

相关问题 更多 >