C++ C';s Python API:调用Python函数2X会导致访问冲突写入位置

C++ C';s Python API:调用Python函数2X会导致访问冲突写入位置,c++,c,python-3.x,memory,python-c-api,C++,C,Python 3.x,Memory,Python C Api,我试图编写一些C代码来调用一些python代码来进行数据分析,但我遇到了一个奇怪的问题。如果我调用initializepython,调用一个函数,完成python,然后重复同样的一次,那么在我第二次尝试调用该函数时,就会出现访问冲突写入位置错误。下面是简单的代码: #include "stdafx.h" #include <iostream> #include "Python.h" int main() { for (int testInc = 0; testInc <

我试图编写一些C代码来调用一些python代码来进行数据分析,但我遇到了一个奇怪的问题。如果我调用initializepython,调用一个函数,完成python,然后重复同样的一次,那么在我第二次尝试调用该函数时,就会出现访问冲突写入位置错误。下面是简单的代码:

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

int main()
{
    for (int testInc = 0; testInc < 2; testInc++)
    {
        std::cout << testInc + 1 << std::endl;
        PyObject *pName, *pModule, *pFunc, *pValue;
        Py_Initialize();
        PyRun_SimpleString("import sys");
        PyRun_SimpleString("sys.path.append(\"PathToCode\")");
        pName = PyUnicode_DecodeFSDefault("MyModuleName");
        pModule = PyImport_Import(pName);
        pFunc = PyObject_GetAttrString(pModule, "MyFunctionName");
        pValue = PyObject_CallObject(pFunc, NULL);
        printf("Result: %s\n", PyBytes_AS_STRING(PyUnicode_AsEncodedString(pValue, "ASCII", "strict")));
        Py_DECREF(pName);
        Py_DECREF(pModule);
        Py_DECREF(pFunc);
        Py_DECREF(pValue);
        Py_Finalize();
    }
    return 0;
}

在第二次通过for循环时,始终抛出错误“TestApplication.exe中0x00007FFE1EBC199C(multiarray.cp35-win_amd64.pyd)处未处理的异常:0xC0000005:Access violation写入位置0x000000000000000A”。我正在努力找出原因。如果我将initialize和finalize命令放在for循环之外,那么这很好,但是我对这些命令的理解使我相信这些代码应该是功能性的。此外,如果我在python脚本中省略了“import”命令,那么我的C代码也可以正常运行,这让我相信导入过程中发生了一些奇怪的事情。我是不是误解了什么?

0x000000000000000A是一个内核内存错误。为什么每次都要初始化解释器?@IgnacioVazquez Abrams我不需要这样做,但当我遇到并跟踪错误源时,这似乎是运行我想用python编写的代码的自然方式。在该代码中,每次收集数据时,我都会启动一个调用此python代码的工作线程,因此在线程中初始化python以保持线程自包含对我来说是有意义的。也许这是一个错误或愚蠢的做法,但它似乎仍然应该起作用:/原则上,它应该能够初始化Python环境并在同一个应用程序中多次完成它。实际上,有一个令人印象深刻的列表。是的,我看到了那个页面。尽管调用“import numpy\n import numpy”应该可以正常工作,但我想知道这是否与“动态加载的扩展模块由Python加载而未卸载”一行有关。此外,“如果多次调用其初始化例程,则某些扩展可能无法正常工作”的语句也很模糊:(0x000000000000000A是一个内核内存错误。为什么每次都要初始化解释器?@IgnacioVazquez Abrams我不需要这样做,但这似乎是运行代码的自然方式,我希望在遇到并跟踪错误源时使用python。在这段代码中,每次收集数据时,我都会启动一个工作程序-调用此python代码的线程,因此在线程中初始化python以保持线程的自包含性对我来说是有意义的。也许这是一个错误或愚蠢的,但它似乎仍然应该工作:/原则上,它应该可以初始化python环境并在同一应用程序中多次完成它。实际上,在e是一个令人印象深刻的列表。是的,我看到了那个页面。我想知道它是否与“动态加载的Python加载的扩展模块未卸载”一行有关,尽管调用“import numpy\n import numpy”应该可以很好地工作“如果多次调用某些扩展的初始化例程,则它们可能无法正常工作;”非常模糊:(
def myFunctionName():
    import numpy
    return "Hi!"