嵌入扩展python会占用所有内存

embeding extended python eats all the memory

本文关键字:内存 扩展 python      更新时间:2023-10-16

在遵循python嵌入/扩展教程时,我想出了以下代码

#include <boost/filesystem.hpp>
#include <Python.h>
static PyObject *
spam_system(PyObject *self, PyObject *args) {
    const char *command;
    int sts;
    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    return PyLong_FromLong(sts);
}
static char SpamModuleName[] = "spam00";
int main(int argc, char const *argv[]) {
    Py_SetPath((
        boost::filesystem::canonical("./python_lib.zip").wstring()
    ).c_str());
    PyImport_AppendInittab(SpamModuleName,[](){
        static PyMethodDef SpamMethods[] = {
            {"system", spam_system, METH_VARARGS, "Execute a shell command."},
            {NULL, NULL, 0, NULL}
        };
        static struct PyModuleDef spammodule = {
            PyModuleDef_HEAD_INIT,
            SpamModuleName,
            NULL,
            -1,
            SpamMethods,
            NULL, NULL, NULL, NULL
        };
        return PyModule_Create(&spammodule);
    });
    Py_Initialize();
    PyRun_SimpleString(
        "import spamn"
        "status = spam.system("ls -l")n"
    );
    Py_Finalize();
    return 0;
}

代码编译得很好(使用g++ -std=c++11 main.cpp -lpython33.64 -lboost_filesystem -lboost_system -s,我使用x64原生mingw工具链由Stephan T. Lavavej),但当运行我的程序分配大约4 gig的ram和100%的cpu使用率(procexp截图)在PyRun_SimpleString("import spamn")和更经常崩溃与python MemoryError

PyImport_ImportModule(SpamModuleName);也使程序崩溃,也是在分配了大量内存之后(实际上我从未成功运行过这个函数)。

如果我结束所有其他程序,并释放尽可能多的内存,程序运行良好,并产生预期的输出,但资源消耗使它不可用。我做错了什么/什么使python使用那么多资源?

编辑在讨论了mingw-w64 irc之后,我得到了它的工作,并将发布解决方案作为答案,以防其他人发现自己在我的地方

由于用户alexeyktietz的广泛帮助,我指出了用64位VC构建的python.dll在导入由GCC构建的x64二进制文件时存在问题。解决方案是自己构建这个库,同时给它打补丁以便在MINGWx64下编译。

你可以在这里找到这些补丁或者在这里找到预构建的库。