2013-12-23 19:21:51 +08:00
|
|
|
|
#include <tchar.h>
|
|
|
|
|
|
#include "Python.h"
|
2013-12-27 20:06:49 +08:00
|
|
|
|
#include <thread>
|
|
|
|
|
|
#include <future>
|
2013-12-25 19:26:58 +08:00
|
|
|
|
|
2013-12-29 21:50:56 +08:00
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
2013-12-25 19:26:58 +08:00
|
|
|
|
extern "C" __declspec(dllexport) void InitPythonEnv()
|
|
|
|
|
|
{
|
2013-12-27 20:06:49 +08:00
|
|
|
|
Py_Initialize();
|
|
|
|
|
|
PyEval_InitThreads();
|
2014-01-03 19:29:46 +08:00
|
|
|
|
PyEval_ReleaseLock();
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>ǰִ<C7B0>У<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ͷ<EFBFBD>PyEval_InitThreads<64><73><EFBFBD>õ<EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳̿<DFB3><CCBF><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD>ȡ<EFBFBD><C8A1>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2013-12-25 19:26:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2013-12-27 20:06:49 +08:00
|
|
|
|
char* GetErrorMessage()
|
2013-12-23 19:21:51 +08:00
|
|
|
|
{
|
2013-12-27 20:06:49 +08:00
|
|
|
|
char *pStrErrorMessage = NULL;
|
2013-12-23 19:21:51 +08:00
|
|
|
|
|
2013-12-27 20:06:49 +08:00
|
|
|
|
if(PyErr_Occurred()){
|
|
|
|
|
|
PyObject *ptype, *pvalue, *ptraceback;
|
|
|
|
|
|
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
|
|
|
|
|
|
pStrErrorMessage = PyString_AsString(pvalue);
|
|
|
|
|
|
}
|
2013-12-23 19:21:51 +08:00
|
|
|
|
|
2013-12-27 20:06:49 +08:00
|
|
|
|
return pStrErrorMessage;
|
|
|
|
|
|
}
|
2013-12-25 19:26:58 +08:00
|
|
|
|
|
|
|
|
|
|
|
2013-12-27 20:06:49 +08:00
|
|
|
|
char* Exec(char* directory, char* file, char* method, char* para)
|
|
|
|
|
|
{
|
|
|
|
|
|
PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *pClass, *pInstance;
|
|
|
|
|
|
char *error;
|
|
|
|
|
|
|
2014-01-03 19:29:46 +08:00
|
|
|
|
PyGILState_STATE gstate = PyGILState_Ensure();
|
2013-12-27 20:06:49 +08:00
|
|
|
|
|
|
|
|
|
|
// Build the name object
|
2014-01-03 19:29:46 +08:00
|
|
|
|
PyObject *path = PySys_GetObject("path");
|
2013-12-27 20:06:49 +08:00
|
|
|
|
PyList_Append(path, PyString_FromString(directory));
|
|
|
|
|
|
|
|
|
|
|
|
pName = PyString_FromString(file);
|
|
|
|
|
|
error = GetErrorMessage();
|
|
|
|
|
|
if(error != NULL){
|
|
|
|
|
|
char* err =new char[5000]();
|
|
|
|
|
|
sprintf(error, "%s:%s","PYTHONERROR",error);
|
|
|
|
|
|
return err;
|
|
|
|
|
|
}
|
2013-12-23 19:21:51 +08:00
|
|
|
|
|
2013-12-27 20:06:49 +08:00
|
|
|
|
pModule = PyImport_Import(pName);
|
|
|
|
|
|
error = GetErrorMessage();
|
|
|
|
|
|
if(error != NULL){
|
|
|
|
|
|
char* err =new char[5000]();
|
|
|
|
|
|
sprintf(err, "%s:%s","PYTHONERROR",error);
|
|
|
|
|
|
return err;
|
|
|
|
|
|
}
|
2013-12-23 19:21:51 +08:00
|
|
|
|
|
2013-12-27 20:06:49 +08:00
|
|
|
|
pDict = PyModule_GetDict(pModule);
|
|
|
|
|
|
error = GetErrorMessage();
|
|
|
|
|
|
if(error != NULL){
|
|
|
|
|
|
char* err =new char[5000]();
|
|
|
|
|
|
sprintf(err, "%s:%s","PYTHONERROR",error);
|
|
|
|
|
|
return err;
|
|
|
|
|
|
}
|
2013-12-23 19:21:51 +08:00
|
|
|
|
|
2013-12-27 20:06:49 +08:00
|
|
|
|
pClass = PyDict_GetItemString(pDict,"PyWinAlfred");
|
|
|
|
|
|
error = GetErrorMessage();
|
|
|
|
|
|
if(error != NULL){
|
|
|
|
|
|
char* err =new char[5000]();
|
|
|
|
|
|
sprintf(err, "%s:%s","PYTHONERROR",error);
|
|
|
|
|
|
return err;
|
|
|
|
|
|
}
|
2013-12-23 19:21:51 +08:00
|
|
|
|
|
2013-12-27 20:06:49 +08:00
|
|
|
|
pInstance = PyObject_CallObject(pClass, NULL);
|
|
|
|
|
|
error = GetErrorMessage();
|
|
|
|
|
|
if(error != NULL){
|
|
|
|
|
|
char* err =new char[5000]();
|
|
|
|
|
|
sprintf(err, "%s:%s","PYTHONERROR",error);
|
|
|
|
|
|
return err;
|
|
|
|
|
|
}
|
2013-12-23 19:21:51 +08:00
|
|
|
|
|
2013-12-27 20:06:49 +08:00
|
|
|
|
// Call a method of the class with two parameters
|
|
|
|
|
|
pValue = PyObject_CallMethod(pInstance,method, "(s)",para);
|
|
|
|
|
|
error = GetErrorMessage();
|
|
|
|
|
|
if(error != NULL){
|
|
|
|
|
|
char* err =new char[5000]();
|
|
|
|
|
|
sprintf(err, "%s:%s","PYTHONERROR",error);
|
|
|
|
|
|
return err;
|
|
|
|
|
|
}
|
2013-12-23 19:21:51 +08:00
|
|
|
|
|
2013-12-27 20:06:49 +08:00
|
|
|
|
char * str_ret = PyString_AsString(pValue);
|
2013-12-25 19:26:58 +08:00
|
|
|
|
|
2014-01-03 19:29:46 +08:00
|
|
|
|
//PyErr_Clear();
|
|
|
|
|
|
PyGILState_Release(gstate);
|
2013-12-27 20:06:49 +08:00
|
|
|
|
|
|
|
|
|
|
return str_ret;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
extern "C" __declspec(dllexport) char* ExecPython(char* directory, char* file, char* method, char* para)
|
|
|
|
|
|
{
|
2014-01-03 19:29:46 +08:00
|
|
|
|
char* s = Exec(directory,file,method,para);
|
|
|
|
|
|
PyGILState_Ensure();
|
|
|
|
|
|
return s;
|
|
|
|
|
|
//auto future = std::async(Exec,directory,file,method,para);
|
|
|
|
|
|
//return future.get();
|
2013-12-23 19:21:51 +08:00
|
|
|
|
}
|