2014-06-05 6 views
2

다음 비단뱀 embedding/extending tutorial 내가 내 programm에의 할당을 실행할 때 코드가 잘 (내가 스테판 T. Lavavej에 의해 64 native mingw toolchain를 사용 g++ -std=c++11 main.cpp -lpython33.64 -lboost_filesystem -lboost_system -s 사용) 아직 때문에 컴파일 코드를embeding 확장 파이썬은 모든 메모리를 먹는

#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; 
} 

을 다음과 같이 와서 동안 약 4 기가 램과 (procexp screenshot)PyRun_SimpleString("import spam\n")에 100 % cpu 사용이 있고 종종 이무기와 충돌합니다. MemoryError.

PyImport_ImportModule(SpamModuleName); 또한 많은 메모리를 할당 한 후에도 프로그램을 중단시킵니다 (사실이 함수로 성공한 프로그램을 실행하지 못했습니다).

다른 모든 프로그램을 끝내고 가능한 많은 RAM을 없애면 프로그램이 제대로 실행되고 예상되는 출력이 나오지만 리소스를 줄이면 성능이 떨어집니다. 왜 내가 잘못했는지/파이썬이 많은 자원을 사용하게 만드는 이유는 무엇입니까?

편집와 Mingw-W64의 IRC에 대한 토론 후 나는 일하고 다른 사람이 사용자 alexeyktietz 내가 있었다에서 내 자리에 광범위한 도움을

+0

관련 http://stackoverflow.com/questions/3778370/python-extensions-for-win64-via-gcc – Valerij

답변

0

덕분에 스스로가 찾을 경우 답변과 솔루션을 게시 할 것 얻었다 사실 64 비트 VC로 빌드 된 python.dll은 GCC에 의해 빌드 된 x64 바이너리를 가져 오는 데 문제가 있습니다. 해결 방법은 직접 lib를 빌드하는 동안 패치를 적용하여 unter MINGWx64를 컴파일하는 것입니다.

those patches here 또는 prebuilt libraries here을 찾을 수 있습니다.

+0

이 공개 버그는 mingw 및 python 확장 기능의 문제점에 대해 설명합니다. https://github.com/ContinuumIO/anaconda 이슈/이슈/271 –