gpt4 book ai didi

c++ - 如何修复 C++ 中的 PyImport_Import(python35.dll 中的异常)

转载 作者:行者123 更新时间:2023-11-28 01:20:47 25 4
gpt4 key购买 nike

我正在尝试一个非常基本的“hello world”程序,它应该在我的 C++ 控制台应用程序中嵌入一个 python 脚本,但它在 pModule = PyImport_Import(pName); 处失败并出现未指定的异常“访问违规阅读位置……”

我已经能够为没有定义和返回的 python 脚本运行 PyRun_SimpleFile(),但是对于我 future 的应用程序,我需要一个有返回值的 python 方法,所以 PyRun_SimpleFile() 不是一个选项。

我的代码,基于 this Introduction是:

主要.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(在我的 VS2015 解决方案的调试位置):

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

最佳答案

好吧,我相信您的代码中缺少一些指令,例如 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 进行了初始化。

关于c++ - 如何修复 C++ 中的 PyImport_Import(python35.dll 中的异常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56396346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com