开发者

I want to embed Python to MVC application, by linking dynamically to python

I want to embed Python to m vc application, by linking dynamically to 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);
    }
}
cat开发者_如何学Goch(...)
{

}

And then I want to execute a Python script through my MFC application -

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

I am facing two problems here , I want to link to Python dynamically and also make my vc application independent of the location on which Python is installed on the users machine. However , I am required to include python.h for my code to compile the following declaration.

PyObject* pCodeObject

Is there a workaround for this ? Or do I have to specify the include for "Python.h" ? Which would mean again the program becomes path dependent.

I tried copying some of the python definitions including PyObject into a header in my mfc app. Then it complies fine. but Py_CompileString call fails. so finally I am unable to run script from my MFC application by linking to python dynamically.

How can this be done ? Please help. Is there a different approach to linking to python dynamically. Please could you write to me ?


What you are doing is quite triky... I don't understand the problem with Python.h. It is needed only for compiling your program, not for running it. Surely you do not need it to be compile-time-path-independent, do you?

Anyway, you may get rid of the PyObject* definition simply by replacing it with void*, because they are binary compatible types. And it looks like you don't care too much about the type safety of your solution.

I'd say that the reason why your Py_CompileString fails may be because you have an error in your script, or something. You should really look into the raised python exception.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜