14
16
struct pcilib_py_s {
15
17
PyObject *main_module;
16
18
PyObject *global_dict;
19
int py_initialized_inside; ///< Flag, shows that Py_Initialize has been called inside class
19
struct pcilib_script_s {
22
typedef struct pcilib_script_s {
20
24
PyObject *py_script_module; /**< PyModule object, contains script enviroment */
26
pcilib_access_mode_t mode;
31
struct pcilib_script_s *scripts = NULL;
25
33
int pcilib_init_py(pcilib_t *ctx) {
26
34
ctx->py = (pcilib_py_t*)malloc(sizeof(pcilib_py_t));
27
35
if (!ctx->py) return PCILIB_ERROR_MEMORY;
29
37
if(!Py_IsInitialized())
40
ctx->py->py_initialized_inside = 1;
43
ctx->py->py_initialized_inside = 0;
32
45
ctx->py->main_module = PyImport_AddModule("__parser__");
33
46
if (!ctx->py->main_module)
34
47
return PCILIB_ERROR_FAILED;
36
49
ctx->py->global_dict = PyModule_GetDict(ctx->py->main_module);
37
50
if (!ctx->py->global_dict)
38
51
return PCILIB_ERROR_FAILED;
54
//create path string, where the model scripts should be
55
static int model_dir_added = 0;
58
char* model_dir = getenv("PCILIB_MODEL_DIR");
59
char* model_path = malloc(strlen(model_dir) + strlen(ctx->model) + 2);
60
if (!model_path) return PCILIB_ERROR_MEMORY;
61
sprintf(model_path, "%s/%s", model_dir, ctx->model);
63
PyObject* path = PySys_GetObject("path");
64
if(PyList_Append(path, PyString_FromString(model_path)) == -1)
66
pcilib_error("Cant set PCILIB_MODEL_DIR library path to python.");
68
return PCILIB_ERROR_FAILED;
43
76
void pcilib_free_py(pcilib_t *ctx) {
78
int py_initialized_inside = 0;
81
if(ctx->py->py_initialized_inside)
82
py_initialized_inside = 1;
45
84
// Dict and module references are borrowed
89
if(py_initialized_inside)
196
237
return pcilib_set_value_from_float(ctx, value, PyFloat_AsDouble(obj));
199
void* pcilib_convert_val_to_pyobject(pcilib_t* ctx, pcilib_value_t *val)
240
void* pcilib_get_value_as_pyobject(pcilib_t* ctx, pcilib_value_t *val)
245
int pcilib_convert_pyobject_to_val(pcilib_t* ctx, void* pyObjVal, pcilib_value_t *val)
286
int pcilib_set_value_from_pyobject(pcilib_t* ctx, void* pyObjVal, pcilib_value_t *val)
247
288
PyObject* pyVal = pyObjVal;
271
int pcilib_init_py_script(pcilib_t *ctx, char* module_name, pcilib_script_t **module, pcilib_access_mode_t *mode)
312
int pcilib_py_init_script(pcilib_t *ctx, char* module_name, pcilib_access_mode_t *mode)
273
//Initialize python script, if it has not initialized already.
276
pcilib_error("Invalid script name specified in XML property (NULL)");
277
return PCILIB_ERROR_INVALID_DATA;
280
//create path string to scripts
281
char* model_dir = getenv("PCILIB_MODEL_DIR");
282
char* model_path = malloc(strlen(model_dir) + strlen(ctx->model) + 2);
283
if (!model_path) return PCILIB_ERROR_MEMORY;
284
sprintf(model_path, "%s/%s", model_dir, ctx->model);
286
//set model path to python
287
PySys_SetPath(model_path);
291
//create path string to pcipywrap library
292
char* app_dir = getenv("APP_PATH");
293
char* pcipywrap_path;
296
pcipywrap_path = malloc(strlen(app_dir) + strlen("/pywrap"));
297
if (!pcipywrap_path) return PCILIB_ERROR_MEMORY;
298
sprintf(pcipywrap_path, "%s/%s", "/pywrap", ctx->model);
302
pcipywrap_path = malloc(strlen("./pywrap"));
303
if (!pcipywrap_path) return PCILIB_ERROR_MEMORY;
304
sprintf(pcipywrap_path, "%s", "./pywrap");
308
//set pcipywrap library path to python
309
PyObject* path = PySys_GetObject("path");
310
if(PyList_Append(path, PyString_FromString(pcipywrap_path)) == -1)
312
pcilib_error("Cant set pcipywrap library path to python.");
313
return PCILIB_ERROR_FAILED;
315
free(pcipywrap_path);
316
pcipywrap_path = NULL;
319
314
//extract module name from script name
320
315
char* py_module_name = strtok(module_name, ".");
322
316
if(!py_module_name)
324
318
pcilib_error("Invalid script name specified in XML property (%s)."
326
320
return PCILIB_ERROR_INVALID_DATA;
323
pcilib_script_s* module = NULL;
324
HASH_FIND_STR( scripts, module_name, module);
327
pcilib_warning("Python module %s is already in hash. Skip init step", module_name);
328
mode[0] = module->mode;
332
//Initialize python module
335
pcilib_error("Invalid script name specified in XML property (NULL)");
336
return PCILIB_ERROR_INVALID_DATA;
329
339
//import python script
330
340
PyObject* py_script_module = PyImport_ImportModule(py_module_name);
336
346
return PCILIB_ERROR_INVALID_DATA;
340
349
//Initializing pcipywrap module if script use it
341
350
PyObject* dict = PyModule_GetDict(py_script_module);
342
351
if(PyDict_Contains(dict, PyString_FromString("pcipywrap")))
351
360
//setting pcilib_t instance
352
361
PyObject_CallMethodObjArgs(pcipywrap_module,
353
PyUnicode_FromString("setPcilib"),
362
PyUnicode_FromString("set_pcilib"),
354
363
PyByteArray_FromStringAndSize((const char*)&ctx, sizeof(pcilib_t*)),
358
367
//Success. Create struct and initialize values
359
module[0] = (pcilib_script_t*)malloc(sizeof(pcilib_script_t));
360
module[0]->py_script_module = py_script_module;
361
module[0]->script_name = module_name;
362
module[0]->dict = dict;
368
module = malloc(sizeof(pcilib_script_s));
369
module->py_script_module = py_script_module;
370
module->script_name = malloc(strlen(module_name));
371
sprintf(module->script_name, "%s", module_name);
364
375
//Setting correct mode
367
378
mode[0] |= PCILIB_ACCESS_R;
368
379
if(PyDict_Contains(dict, PyString_FromString("write_to_register")))
369
380
mode[0] |= PCILIB_ACCESS_W;
374
int pcilib_free_py_script(pcilib_script_t *module)
378
if(module->script_name)
380
free(module->script_name);
381
module->script_name = NULL;
384
if(module->py_script_module)
386
//PyObject_Free(module->py_script_module);
387
module->py_script_module = NULL;
394
int pcilib_script_read(pcilib_t *ctx, pcilib_script_t *module, pcilib_value_t *val)
382
module->mode = mode[0];
383
HASH_ADD_STR( scripts, script_name, module);
388
int pcilib_py_free_script(char* module_name)
390
pcilib_script_s *module;
391
HASH_FIND_STR(scripts, module_name, module);
395
//For some reason it will crash if uncomment. printf same warning is ok
396
//pcilib_warning("Cant find Python module %s in hash. Seems it has already deleted.", module_name);
400
if(module->script_name)
402
free(module->script_name);
403
module->script_name = NULL;
406
if(module->py_script_module)
408
//PyObject_Free(module->py_script_module);
409
module->py_script_module = NULL;
412
HASH_DEL(scripts, module);
417
int pcilib_script_read(pcilib_t *ctx, char* module_name, pcilib_value_t *val)
419
pcilib_script_s *module;
420
HASH_FIND_STR(scripts, module_name, module);
424
pcilib_error("Failed to find script module (%s) in hash", module_name);
425
return PCILIB_ERROR_NOTFOUND;
404
435
return PCILIB_ERROR_FAILED;
407
err = pcilib_convert_pyobject_to_val(ctx, ret, val);
438
err = pcilib_set_value_from_pyobject(ctx, ret, val);
417
int pcilib_script_write(pcilib_t *ctx, pcilib_script_t *module, pcilib_value_t *val)
448
int pcilib_script_write(pcilib_t *ctx, char* module_name, pcilib_value_t *val)
419
PyObject *input = pcilib_convert_val_to_pyobject(ctx, val);
450
pcilib_script_s *module;
451
HASH_FIND_STR(scripts, module_name, module);
455
pcilib_error("Failed to find script module (%s) in hash", module_name);
456
return PCILIB_ERROR_NOTFOUND;
459
PyObject *input = pcilib_get_value_as_pyobject(ctx, val);
422
462
printf("Failed to convert input value to Python object");