在跟随pythons embedding/extending tutorial时,我提出了以下代码
#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[] = "spam\000";
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 spam\n"
"status = spam.system(\"ls -l\")\n"
);
Py_Finalize();
return 0;
}
代码编译正常(使用g++ -std=c++11 main.cpp -lpython33.64 -lboost_filesystem -lboost_system -s
我使用x64 native mingw toolchain由Stephan T. Lavavej)但是在运行我的程序时分配大约4 gig的ram并且具有100%的cpu使用率(procexp screenshot)在PyRun_SimpleString("import spam\n")
中,经常与蟒蛇MemoryError
崩溃。
PyImport_ImportModule(SpamModuleName);
也会在分配大量内存后崩溃程序(事实上我从未使用此函数成功运行)。
如果我结束所有其他程序并尽可能多地释放ram,那么程序运行正常并产生预期的输出,但资源吃掉使它无法解决。我做错了什么/是什么让python使用那么多资源?
讨论了mingw-w64之后编辑 irc我得到了它的工作,并将解决方案作为答案发布,以防其他人在我的位置找到自己
答案 0 :(得分:0)
感谢用户alexey
和ktietz
的广泛帮助,我指出使用64位VC构建的python.dll导入由GCC构建的x64二进制文件时出现问题。解决方案是自己构建lib,同时修补它以编译unter MINGWx64。