consume - ¿Cómo acceder a una variable global de Python desde C?
python compiler (4)
Tengo algunas variables globales en una secuencia de comandos de Python. Algunas funciones en esa secuencia de comandos llaman a C: ¿es posible establecer una de esas variables en C y, de ser así, cómo?
Aprecio que este no es un diseño muy bueno en primer lugar, pero necesito hacer un pequeño cambio en el código existente, no quiero embarcarme en una refactorización importante de las secuencias de comandos existentes.
Recomiendo usar pyrex
para hacer un módulo de extensión en el que pueda almacenar los valores en python, y cdef una serie de funciones a las que se puede llamar desde C para devolver los valores allí.
De lo contrario, mucho depende del tipo de valores que intentas transmitir.
¿Estás dispuesto a modificar la API un poco ?
Puede hacer que la función C devuelva el nuevo valor para el global y luego llamarlo así:
my_global = my_c_func(...)
Si está utilizando Robin o la API de Python C directamente, puede pasar el diccionario global como un parámetro adicional y modificarlo
- Si su global siempre está en el mismo módulo, la solución de Sherm se ve genial
No soy un gurú de Python, pero encontré esta pregunta interesante, así que busqué en Google. Este fue el primer éxito en "API de incrustación de Python". ¿Ayuda?
Si los atributos pertenecen al alcance global de un módulo, entonces puede usar "PyImport_AddModule" para obtener un control del objeto del módulo. Por ejemplo, si quisiera obtener el valor de un entero en el módulo principal llamado "foobar", haría lo siguiente:
PyObject *m = PyImport_AddModule("__main__"); PyObject *v = PyObject_GetAttrString(m,"foobar"); int foobar = PyInt_AsLong(v); Py_DECREF(v);
Para cualquiera que venga desde Google, aquí está el método directo:
PyObject* PyEval_GetGlobals()
https://docs.python.org/2/c-api/reflection.html
https://docs.python.org/3/c-api/reflection.html
Se accede al valor de retorno como un diccionario.