从C调用Python

前端之家收集整理的这篇文章主要介绍了从C调用Python前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试从我的主C程序中调用 Python脚本中的函数. python函数接受一个字符串作为参数并且不返回任何内容(ok ..’None’).
只要前一次调用在再次调用函数之前完成,它就完美地工作(从未想过会那么容易……),否则在pModule = PyImport_Import(pName)处存在访问冲突.

有很多教程如何在C中嵌入python,反之亦然,但我没有发现这个问题.

int callPython(TCHAR* title){
    PyObject *pName,*pModule,*pFunc;
    PyObject *pArgs,*pValue;

Py_Initialize();
    pName = PyUnicode_FromString("Main");
    /* Name of Pythonfile */

    pModule = PyImport_Import(pName);
    Py_DECREF(pName);

if (pModule != NULL) {
        pFunc = PyObject_GetAttrString(pModule,"writeLyricToFile");
        /* function name. pFunc is a new reference */
        if (pFunc && PyCallable_Check(pFunc)) {
            pArgs = PyTuple_New(1);

    pValue = PyUnicode_FromWideChar(title,-1);

    if (!pValue) {
        Py_DECREF(pArgs);
                Py_DECREF(pModule);
        showErrorBox(_T("pValue is false"));
        return 1;
            }
    PyTuple_SetItem(pArgs,pValue);

            pValue = PyObject_CallObject(pFunc,pArgs);
            Py_DECREF(pArgs);

            if (pValue != NULL) {
                //worked as it should!
                Py_DECREF(pValue);
            }
            else {
                Py_DECREF(pFunc);
                Py_DECREF(pModule);
                PyErr_Print();
        showErrorBox(_T("pValue is null"));
        return 1;
            }
        }
        else {
            if (PyErr_Occurred()) PyErr_Print();
            showErrorBox(_T("pFunc null or not callable"));
        return 1;
        }
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
    }
    else {
        PyErr_Print();
        showErrorBox(_T("pModule is null"));
    return 1;
    }
    Py_Finalize();
    return 0;
}

解决方法

当你说“只要在再次调用函数之前完成上一次调用”时,我只能假设你有多个线程从C调用到Python. python不是线程安全的,所以这将失败!

阅读Python手册中的全局解释器锁(GIL).也许以下链接将有所帮助:

> http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock
> http://docs.python.org/c-api/init.html#PyEval_InitThreads
> http://docs.python.org/c-api/init.html#PyEval_AcquireLock
> http://docs.python.org/c-api/init.html#PyEval_ReleaseLock

维基百科上提到了GIL:

> http://en.wikipedia.org/wiki/Global_Interpreter_Lock

原文链接:https://www.f2er.com/c/119706.html

猜你在找的C&C++相关文章