Я хочу встроить Python в приложение MVC, динамически связывая с Python - PullRequest
1 голос
/ 04 августа 2011

Я хочу встроить Python в m vc application, динамически связываясь с Python.

    hModPython = AfxLoadLibrary("Python23.dll");

pFnPyRun_SimpleString *pFunction = NULL;
pFnPy_Initialize *pPy_Initialize = NULL;

pFunction = (pFnPyRun_SimpleString *)::GetProcAddress(hModPython, "PyRun_SimpleString");
pPy_Initialize = (pFnPy_Initialize *)::GetProcAddress(hModPython, "Py_Initialize");

try
{
    pPy_Initialize();

    if ( pFunction )
    {
        (*pFunction)("import sys");     // call the code
    }
    else
    {
        AfxMessageBox("unable to access function from python23.dll.", MB_ICONSTOP|MB_OK);
    }
}
catch(...)
{

}

А потом я хочу выполнить скрипт Python через мое приложение MFC -

    HANDLE hFile = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

DWORD dwSize = GetFileSize(hFile, NULL);
DWORD dwRead;

char *s = new char[dwSize +1];

ReadFile(hFile, s, dwSize, &dwRead, NULL);

s[dwSize] = '\0';

CString wholefile(s);

wholefile.Remove('\r');
wholefile+="\n";
CloseHandle(hFile);

pFnPy_CompileString *pFPy_CompileString = (pFnPy_CompileString *)::GetProcAddress(hModPython, "Py_CompileString");

CString fl(file);

PyObject* pCodeObject = pFPy_CompileString(wholefile.GetBuffer(0), fl.GetBuffer(0), Py_file_input);

if (pCodeObject != NULL)
{
    pFnPyEval_EvalCode *pFPyEval_EvalCode = (pFnPyEval_EvalCode *)::GetProcAddress(hModPython, "PyEval_EvalCode");

    PyObject* pObject = pFPyEval_EvalCode((PyCodeObject*)pCodeObject, m_Dictionary, m_Dictionary);
}

Здесь я сталкиваюсь с двумя проблемами, я хочу динамически связываться с Python, а также сделать мое vc-приложение независимым от места, в котором Python установлен на компьютере пользователя. Однако я должен включить python.h для моего кода, чтобы скомпилировать следующее объявление.

PyObject * pCodeObject

Есть ли обходной путь для этого? Или я должен указать включение для "Python.h"? Что означало бы снова, что программа становится зависимой от пути.

Я попытался скопировать некоторые определения python, включая PyObject, в заголовок моего приложения mfc. Тогда это соответствует нормально. но вызов Py_CompileString не удается. и, наконец, я не могу запустить скрипт из своего приложения MFC, динамически связываясь с python.

Как это можно сделать? Пожалуйста помоги. Есть ли другой подход к динамическому связыванию с питоном. Пожалуйста, не могли бы вы написать мне?

1 Ответ

0 голосов
/ 04 августа 2011

То, что вы делаете, довольно сложно ... Я не понимаю проблемы с Python.h. Это нужно только для компиляции вашей программы, а не для ее запуска. Конечно, вам не нужно, чтобы он был независим от времени компиляции, не так ли?

В любом случае, вы можете избавиться от определения PyObject *, просто заменив его на void *, поскольку они являются двоично-совместимыми типами. И похоже, что вы не слишком заботитесь о безопасности типов вашего решения.

Я бы сказал, что причиной сбоя Py_CompileString может быть ошибка в вашем скрипте или что-то в этом роде. Вы действительно должны заглянуть в исключение поднятого Python.

...