Importing tensorflow when embedding python in c++ returns null

后端 未结 2 1767
猫巷女王i
猫巷女王i 2020-12-19 08:55

I\'ve a question regarding embedding python into a C++ application. The setup is as follows: I have a large C++ application which generates some data (renders images in real

相关标签:
2条回答
  • 2020-12-19 09:05

    I've resolved the issue. I needed to set argc and argv with PySys_SetArgv. I've uncovered this using PyErr_Occurred() and PyErr_Print() right after the failed import to see the problem.

    0 讨论(0)
  • 2020-12-19 09:07

    ref: https://docs.python.org/3.5/extending/embedding.html

    main.cpp

    #include <Python.h>
    #include <iostream>
    #include <QString>
    #include <QDir>
    #include <cstring>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        PyObject *pName, *pModule, *pDict, *pFunc;
        PyObject *pArgs, *pValue;
        int i;
    
        if (argc < 3) {
            fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
            return 1;
        }
    
        Py_SetProgramName((wchar_t*)L"test");
    
        Py_Initialize();
    
        PySys_SetArgv(argc, (wchar_t**)argv);
        PyRun_SimpleString("import tensorflow as tf\n"
                           "print(tf.__version__)\n");
    
        PyRun_SimpleString("import cv2\n"
                           "print(cv2.__version__)\n");
    
        QString qs = QDir::currentPath();
        std::wstring ws = qs.toStdWString();
        PySys_SetPath(ws.data());
        pName = PyUnicode_DecodeFSDefault(argv[1]);
        /* Error checking of pName left out */
    
        pModule = PyImport_Import(pName);
        Py_DECREF(pName);
    
        if (pModule != NULL) {
            pFunc = PyObject_GetAttrString(pModule, argv[2]);
            /* pFunc is a new reference */
    
            if (pFunc && PyCallable_Check(pFunc)) {
                pArgs = PyTuple_New(argc - 3);
                for (i = 0; i < argc - 3; ++i) {
                    pValue = PyLong_FromLong(atoi(argv[i + 3]));
                    if (!pValue) {
                        Py_DECREF(pArgs);
                        Py_DECREF(pModule);
                        fprintf(stderr, "Cannot convert argument\n");
                        return 1;
                    }
                    /* pValue reference stolen here: */
                    PyTuple_SetItem(pArgs, i, pValue);
                }
                pValue = PyObject_CallObject(pFunc, pArgs);
                Py_DECREF(pArgs);
                if (pValue != NULL) {
                    printf("Result of call: %ld\n", PyLong_AsLong(pValue));
                    Py_DECREF(pValue);
                }
                else {
                    Py_DECREF(pFunc);
                    Py_DECREF(pModule);
                    PyErr_Print();
                    fprintf(stderr,"Call failed\n");
                    return 1;
                }
            }
            else {
                if (PyErr_Occurred())
                    PyErr_Print();
                fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
            }
            Py_XDECREF(pFunc);
            Py_DECREF(pModule);
        }
        else {
            PyErr_Print();
            fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
            return 1;
        }
        Py_Finalize();
        return 0;
    }
    

    multiply.py

    import tensorflow as tf
    import cv2
    
    def multiply(a,b):
        print(tf.__version__) 
        print(cv2.__version__) 
        print("Will compute", a, "times", b)
        c = 0
        for i in range(0, a):
            c = c + b
        return c
    
    0 讨论(0)
提交回复
热议问题