version 1.1, 2018/09/08 00:16:19 |
version 1.3, 2018/09/08 05:04:34 |
|
|
/* $OpenXM$ |
/* $OpenXM: OpenXM/src/ox_python/ox_python.c,v 1.2 2018/09/08 03:05:19 takayama Exp $ |
*/ |
*/ |
|
|
#include <stdio.h> |
#include <stdio.h> |
Line 371 int sm_executeFunction() |
|
Line 371 int sm_executeFunction() |
|
show_double_list(); |
show_double_list(); |
}else if (strcmp(func->s,"restart")==0) { |
}else if (strcmp(func->s,"restart")==0) { |
pop(); restart(); |
pop(); restart(); |
|
}else if (strcmp(func->s,"PyRun_String")==0) { |
|
my_PyRun_String(); |
|
}else if (strcmp(func->s,"eval")==0) { |
|
my_eval2b(); |
}else { |
}else { |
push(make_error2("sm_executeFunction, unknown function",NULL,0,-1)); |
push(make_error2("sm_executeFunction, unknown function",NULL,0,-1)); |
return -1; |
return -1; |
Line 390 int sm_executeStringByLocalParser() |
|
Line 394 int sm_executeStringByLocalParser() |
|
// push(make_error2("sm_executeStringByLocalParser",NULL,0,-1)); |
// push(make_error2("sm_executeStringByLocalParser",NULL,0,-1)); |
push((cmo *)new_cmo_int32(status)); |
push((cmo *)new_cmo_int32(status)); |
return(0); |
return(0); |
|
/* Todo, set the flag by Py_InspectFlag to avoid exit after exception. |
|
See PyRun_SimpleStringFlags, https://docs.python.jp/2.7/c-api/veryhigh.html |
|
*/ |
} |
} |
|
|
|
|
Line 454 void myhandler(const char *reason,const char *file,int |
|
Line 461 void myhandler(const char *reason,const char *file,int |
|
cmo *m; |
cmo *m; |
FILE *fp; |
FILE *fp; |
char logname[1024]; |
char logname[1024]; |
sprintf(logname,"/tmp/ox_gsl-%d.txt",(int) getpid()); |
sprintf(logname,"/tmp/ox_python-%d.txt",(int) getpid()); |
fp = fopen(logname,"w"); |
fp = fopen(logname,"w"); |
fprintf(fp,"%d\n",gsl_errno); |
fprintf(fp,"%d\n",gsl_errno); |
fprintf(fp,"%d\n",line); |
fprintf(fp,"%d\n",line); |
Line 476 void push_error_from_file() { |
|
Line 483 void push_error_from_file() { |
|
int gsl_errno, line; |
int gsl_errno, line; |
cmo *m; |
cmo *m; |
fprintf(stderr,"push_error_from_file()\n"); |
fprintf(stderr,"push_error_from_file()\n"); |
sprintf(logname,"/tmp/ox_gsl-%d.txt",(int) getpid()); |
sprintf(logname,"/tmp/ox_python-%d.txt",(int) getpid()); |
fp = fopen(logname,"r"); |
fp = fopen(logname,"r"); |
if (fp == NULL) { |
if (fp == NULL) { |
fprintf(stderr,"open %s is failed\n",logname); return; |
fprintf(stderr,"open %s is failed\n",logname); return; |
Line 518 int main(int argc,char *argv[]) |
|
Line 525 int main(int argc,char *argv[]) |
|
signal(SIGUSR1,usr1_handler); |
signal(SIGUSR1,usr1_handler); |
#endif |
#endif |
|
|
/* try python */ |
/* Initialize python */ |
Py_SetProgramName(argv[0]); /* optional but recommended */ |
Py_SetProgramName(argv[0]); /* optional but recommended */ |
Py_Initialize(); |
Py_Initialize(); |
/* end of try pythong */ |
|
|
|
|
|
while(1) { |
while(1) { |
Line 567 int get_length(cmo *c) { |
|
Line 573 int get_length(cmo *c) { |
|
return(-1); |
return(-1); |
} |
} |
return(list_length((cmo_list *)c)); |
return(list_length((cmo_list *)c)); |
|
} |
|
|
|
int my_PyRun_String() { |
|
static PyObject *py_main=NULL; |
|
static PyObject *py_dict=NULL; |
|
PyObject *pyRes; |
|
char *cmd; |
|
pop(); // pop argc |
|
cmd = get_string(); |
|
if (cmd == NULL) { |
|
push(make_error2("my_PyRun_Sring: argument is not a string",NULL,0,-1)); |
|
return(-1); |
|
} |
|
printf("cmd=%s\n",cmd); |
|
if (py_main == NULL) py_main = PyImport_AddModule("__main__"); |
|
if (py_dict == NULL) py_dict = PyModule_GetDict(py_main); |
|
// pyRes = PyRun_String(cmd,Py_single_input,py_dict,py_dict); |
|
pyRes = PyRun_String(cmd,Py_single_input,py_dict,py_dict); |
|
if (pyRes==NULL) { |
|
push(make_error2("PyRun_String: exception",NULL,0,-1)); |
|
PyRun_SimpleString("\n"); |
|
/* https://stackoverflow.com/questions/12518435/pyrun-string-stop-sending-result-to-stdout-after-any-error |
|
*/ |
|
return(-1); |
|
} |
|
return push_python_result(pyRes); |
|
} |
|
|
|
int push_python_result(PyObject *pyRes) { |
|
if (PyString_Check(pyRes)) { |
|
push((cmo *)new_cmo_string(PyString_AsString(pyRes))); |
|
return(0); |
|
}else if (PyInt_Check(pyRes)) { |
|
push((cmo *)new_cmo_int32((int) PyInt_AS_LONG(pyRes))); |
|
return(0); |
|
}else { |
|
push((cmo *)new_cmo_string(PyString_AsString(PyObject_Str(pyRes)))); |
|
return(0); |
|
// push(make_error2("PyRun_String returns an object which as not been implemented.",NULL,0,-1)); |
|
// return(-1); |
|
} |
|
} |
|
|
|
|
|
int my_eval() { |
|
static PyObject *pName=NULL; |
|
static PyObject *pModule=NULL; |
|
static PyObject *pDict=NULL; |
|
static PyObject *pFunc=NULL; |
|
PyObject *pArgs, *pValue; |
|
char *cmd; |
|
int i; |
|
pop(); // pop argc |
|
cmd = get_string(); |
|
if (cmd == NULL) { |
|
push(make_error2("my_eval: argument is not a string",NULL,0,-1)); |
|
return(-1); |
|
} |
|
printf("my_eval cmd=%s\n",cmd); |
|
|
|
// code from https://docs.python.jp/2.7/extending/embedding.html |
|
if (pName==NULL) pName = PyString_FromString("__builtin__"); |
|
if (pModule==NULL) pModule = PyImport_Import(pName); |
|
|
|
if (pModule != NULL) { |
|
if (pFunc==NULL) pFunc = PyObject_GetAttrString(pModule, "eval"); |
|
if (pFunc && PyCallable_Check(pFunc)) { |
|
pArgs = PyTuple_New(3); |
|
PyTuple_SetItem(pArgs,0,PyString_FromString(cmd)); |
|
PyTuple_SetItem(pArgs,1,PyEval_GetGlobals()); |
|
PyTuple_SetItem(pArgs,2,PyEval_GetLocals()); |
|
pValue = PyObject_CallObject(pFunc, pArgs); |
|
Py_DECREF(pArgs); |
|
if (pValue != NULL) { |
|
push_python_result(pValue); |
|
// Py_DECREF(pValue); |
|
return(0); |
|
} |
|
else { |
|
PyErr_Print(); |
|
push(make_error2("Fail to call PyObjedct_CallObject(eval,...)",NULL,0,-1)); |
|
return(-1); |
|
} |
|
} |
|
else { |
|
if (PyErr_Occurred()) |
|
PyErr_Print(); |
|
fprintf(stderr, "Cannot find function eval\n"); |
|
} |
|
return(-1); |
|
} |
|
else { |
|
PyErr_Print(); |
|
fprintf(stderr, "Failed to load __builtin__\n"); |
|
return -1; |
|
} |
|
} |
|
|
|
int my_eval2() { |
|
static PyObject *pName=NULL; |
|
static PyObject *pModule=NULL; |
|
static PyObject *pDict=NULL; |
|
static PyObject *pFunc=NULL; |
|
PyObject *pArgs, *pValue; |
|
char *cmd; |
|
int i; |
|
char *cmd2; |
|
pop(); // pop argc |
|
cmd = get_string(); |
|
if (cmd == NULL) { |
|
push(make_error2("my_eval2: argument is not a string",NULL,0,-1)); |
|
return(-1); |
|
} |
|
printf("my_eval2 cmd=%s\n",cmd); |
|
|
|
// code from https://stackoverflow.com/questions/48432577/extracting-value-from-python-after-its-embedded-in-c |
|
cmd2=(char *)GC_malloc(strlen(cmd)+256); |
|
sprintf(cmd2,"f = lambda x: eval(x)"); |
|
PyRun_SimpleString(cmd2); |
|
pModule = PyImport_ImportModule("__main__"); |
|
pFunc= PyObject_GetAttrString(pModule,"f"); |
|
|
|
if (pModule != NULL) { |
|
if (pFunc && PyCallable_Check(pFunc)) { |
|
pArgs = PyTuple_New(1); |
|
PyTuple_SetItem(pArgs,0,PyString_FromString(cmd)); |
|
pValue = PyObject_CallObject(pFunc, pArgs); |
|
Py_DECREF(pArgs); |
|
if (pValue != NULL) { |
|
push_python_result(pValue); |
|
// Py_DECREF(pValue); |
|
return(0); |
|
} |
|
else { |
|
PyErr_Print(); |
|
push(make_error2("Fail to call PyObjedct_CallObject(eval,...)",NULL,0,-1)); |
|
return(-1); |
|
} |
|
}else { |
|
if (PyErr_Occurred()) |
|
PyErr_Print(); |
|
fprintf(stderr, "Cannot find function f\n"); |
|
} |
|
return(-1); |
|
} |
|
else { |
|
PyErr_Print(); |
|
fprintf(stderr, "Failed to load __builtin__\n"); |
|
return -1; |
|
} |
} |
} |