Как исправить PyImport_Import в C ++ (исключение в python35.dll) - PullRequest
0 голосов
/ 31 мая 2019

Я пробую действительно простую программу "hello world", которая должна встраивать скрипт python в мое консольное приложение C ++, но она завершается с ошибкой на pModule = PyImport_Import(pName); с неопределенным исключением "Место чтения нарушения доступа ..."

Я уже смог запустить PyRun_SimpleFile() для сценария Python без определений и возвратов, но для моего будущего приложения мне нужен метод Python с возвратами, поэтому PyRun_SimpleFile() не вариант.

Мойкод, основанный на , это введение :

main.cpp

#include "stdafx.h"
#include <stdlib.h>
#include <Python.h>

int main(int argc, char *argv[])
{
    PyObject *pName, *pModule;
    PyObject *pFunc, *pValue;

    pName = PyUnicode_FromString("HelloWorld");
    pModule = PyImport_Import(pName);
    Py_XDECREF(pName);

    if (pModule)
    {
        pFunc = PyObject_GetAttrString(pModule, "getInteger");
        if (pFunc && PyCallable_Check(pFunc))
        {
            pValue = PyObject_CallObject(pFunc, NULL);
            printf_s("C: getInteger() = %ld\n", PyLong_AsLong(pValue));
            Py_XDECREF(pValue);
        }
        else
        {
            printf("ERROR: function getInteger()\n");
        }
        Py_XDECREF(pFunc);
    }
    else
    {
        printf_s("ERROR: Module not imported\n");
    }

    Py_XDECREF(pModule);

    Py_Finalize();
    return 0;
}

HelloWorld.py (в папке Debug моего решения VS2015):

def getInteger():
    print('Python function getInteger() called')
    c = 100*2
    return c

1 Ответ

2 голосов
/ 31 мая 2019

Ну, я считаю, что в вашем коде не хватает некоторых инструкций, например Py_Initialize.Я бы также использовал PyImport_ImportModule вместо PyImport_Import.Просмотрите следующую последовательность действий:

int main(int argc, char *argv[])
{
    Py_SetPythonHome(L"path/to/python/folder");
    Py_Initialize();
    //PySys_SetArgv(argc, argv); //optional, argv must be wchar_t
    PyObject *pFunc, *pValue;

    pModule = PyImport_ImportModule("HelloWorld");

    if (pModule)
    {
        pFunc = PyObject_GetAttrString(pModule, "getInteger");
        if (pFunc && PyCallable_Check(pFunc))
        {
            pValue = PyObject_CallObject(pFunc, NULL);
            printf_s("C: getInteger() = %ld\n", PyLong_AsLong(pValue));
            Py_XDECREF(pValue);
        }
        else
        {
            printf("ERROR: function getInteger()\n");
        }
        Py_XDECREF(pFunc);
    }
    else
    {
        printf_s("ERROR: Module not imported\n");
    }

    Py_XDECREF(pModule);

    Py_Finalize();
    return 0;
}

Если она все еще не работает, попробуйте добавить ее после PyInitialize:

PyRun_SimpleString(
    "import os, sys \n"
    "sys.path.append(os.getcwd()) \n"
);

Также после PyInitialize вы можете проверить,он инициализируется с Py_IsInitialized.

...