17db96d56Sopenharmony_ci#define PY_SSIZE_T_CLEAN 27db96d56Sopenharmony_ci#include <Python.h> 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ciint 57db96d56Sopenharmony_cimain(int argc, char *argv[]) 67db96d56Sopenharmony_ci{ 77db96d56Sopenharmony_ci PyObject *pName, *pModule, *pFunc; 87db96d56Sopenharmony_ci PyObject *pArgs, *pValue; 97db96d56Sopenharmony_ci int i; 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci if (argc < 3) { 127db96d56Sopenharmony_ci fprintf(stderr,"Usage: call pythonfile funcname [args]\n"); 137db96d56Sopenharmony_ci return 1; 147db96d56Sopenharmony_ci } 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci Py_Initialize(); 177db96d56Sopenharmony_ci pName = PyUnicode_DecodeFSDefault(argv[1]); 187db96d56Sopenharmony_ci /* Error checking of pName left out */ 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci pModule = PyImport_Import(pName); 217db96d56Sopenharmony_ci Py_DECREF(pName); 227db96d56Sopenharmony_ci 237db96d56Sopenharmony_ci if (pModule != NULL) { 247db96d56Sopenharmony_ci pFunc = PyObject_GetAttrString(pModule, argv[2]); 257db96d56Sopenharmony_ci /* pFunc is a new reference */ 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ci if (pFunc && PyCallable_Check(pFunc)) { 287db96d56Sopenharmony_ci pArgs = PyTuple_New(argc - 3); 297db96d56Sopenharmony_ci for (i = 0; i < argc - 3; ++i) { 307db96d56Sopenharmony_ci pValue = PyLong_FromLong(atoi(argv[i + 3])); 317db96d56Sopenharmony_ci if (!pValue) { 327db96d56Sopenharmony_ci Py_DECREF(pArgs); 337db96d56Sopenharmony_ci Py_DECREF(pModule); 347db96d56Sopenharmony_ci fprintf(stderr, "Cannot convert argument\n"); 357db96d56Sopenharmony_ci return 1; 367db96d56Sopenharmony_ci } 377db96d56Sopenharmony_ci /* pValue reference stolen here: */ 387db96d56Sopenharmony_ci PyTuple_SetItem(pArgs, i, pValue); 397db96d56Sopenharmony_ci } 407db96d56Sopenharmony_ci pValue = PyObject_CallObject(pFunc, pArgs); 417db96d56Sopenharmony_ci Py_DECREF(pArgs); 427db96d56Sopenharmony_ci if (pValue != NULL) { 437db96d56Sopenharmony_ci printf("Result of call: %ld\n", PyLong_AsLong(pValue)); 447db96d56Sopenharmony_ci Py_DECREF(pValue); 457db96d56Sopenharmony_ci } 467db96d56Sopenharmony_ci else { 477db96d56Sopenharmony_ci Py_DECREF(pFunc); 487db96d56Sopenharmony_ci Py_DECREF(pModule); 497db96d56Sopenharmony_ci PyErr_Print(); 507db96d56Sopenharmony_ci fprintf(stderr,"Call failed\n"); 517db96d56Sopenharmony_ci return 1; 527db96d56Sopenharmony_ci } 537db96d56Sopenharmony_ci } 547db96d56Sopenharmony_ci else { 557db96d56Sopenharmony_ci if (PyErr_Occurred()) 567db96d56Sopenharmony_ci PyErr_Print(); 577db96d56Sopenharmony_ci fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]); 587db96d56Sopenharmony_ci } 597db96d56Sopenharmony_ci Py_XDECREF(pFunc); 607db96d56Sopenharmony_ci Py_DECREF(pModule); 617db96d56Sopenharmony_ci } 627db96d56Sopenharmony_ci else { 637db96d56Sopenharmony_ci PyErr_Print(); 647db96d56Sopenharmony_ci fprintf(stderr, "Failed to load \"%s\"\n", argv[1]); 657db96d56Sopenharmony_ci return 1; 667db96d56Sopenharmony_ci } 677db96d56Sopenharmony_ci if (Py_FinalizeEx() < 0) { 687db96d56Sopenharmony_ci return 120; 697db96d56Sopenharmony_ci } 707db96d56Sopenharmony_ci return 0; 717db96d56Sopenharmony_ci} 72