| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | #include <Python.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | main(int argc, char *argv[]) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     PyObject *pName, *pModule, *pDict, *pFunc; | 
					
						
							|  |  |  |     PyObject *pArgs, *pValue; | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (argc < 3) { | 
					
						
							|  |  |  |         fprintf(stderr,"Usage: call pythonfile funcname [args]\n"); | 
					
						
							|  |  |  |         return 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Py_Initialize(); | 
					
						
							| 
									
										
										
										
											2014-08-01 12:28:49 +02:00
										 |  |  |     pName = PyUnicode_DecodeFSDefault(argv[1]); | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |     /* Error checking of pName left out */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     pModule = PyImport_Import(pName); | 
					
						
							|  |  |  |     Py_DECREF(pName); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (pModule != NULL) { | 
					
						
							|  |  |  |         pFunc = PyObject_GetAttrString(pModule, argv[2]); | 
					
						
							|  |  |  |         /* pFunc is a new reference */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (pFunc && PyCallable_Check(pFunc)) { | 
					
						
							|  |  |  |             pArgs = PyTuple_New(argc - 3); | 
					
						
							|  |  |  |             for (i = 0; i < argc - 3; ++i) { | 
					
						
							| 
									
										
										
										
											2007-12-02 14:31:20 +00:00
										 |  |  |                 pValue = PyLong_FromLong(atoi(argv[i + 3])); | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |                 if (!pValue) { | 
					
						
							|  |  |  |                     Py_DECREF(pArgs); | 
					
						
							|  |  |  |                     Py_DECREF(pModule); | 
					
						
							|  |  |  |                     fprintf(stderr, "Cannot convert argument\n"); | 
					
						
							|  |  |  |                     return 1; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 /* pValue reference stolen here: */ | 
					
						
							|  |  |  |                 PyTuple_SetItem(pArgs, i, pValue); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             pValue = PyObject_CallObject(pFunc, pArgs); | 
					
						
							|  |  |  |             Py_DECREF(pArgs); | 
					
						
							|  |  |  |             if (pValue != NULL) { | 
					
						
							| 
									
										
										
										
											2007-12-02 14:31:20 +00:00
										 |  |  |                 printf("Result of call: %ld\n", PyLong_AsLong(pValue)); | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |                 Py_DECREF(pValue); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else { | 
					
						
							|  |  |  |                 Py_DECREF(pFunc); | 
					
						
							|  |  |  |                 Py_DECREF(pModule); | 
					
						
							|  |  |  |                 PyErr_Print(); | 
					
						
							|  |  |  |                 fprintf(stderr,"Call failed\n"); | 
					
						
							|  |  |  |                 return 1; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else { | 
					
						
							|  |  |  |             if (PyErr_Occurred()) | 
					
						
							|  |  |  |                 PyErr_Print(); | 
					
						
							|  |  |  |             fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         Py_XDECREF(pFunc); | 
					
						
							|  |  |  |         Py_DECREF(pModule); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else { | 
					
						
							|  |  |  |         PyErr_Print(); | 
					
						
							|  |  |  |         fprintf(stderr, "Failed to load \"%s\"\n", argv[1]); | 
					
						
							|  |  |  |         return 1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-11-30 03:18:29 +00:00
										 |  |  |     if (Py_FinalizeEx() < 0) { | 
					
						
							|  |  |  |         return 120; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } |