Я хочу встроить 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.
Как это можно сделать? Пожалуйста помоги. Есть ли другой подход к динамическому связыванию с питоном. Пожалуйста, не могли бы вы написать мне?