2008-11-12 23 views
6

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?¿Cómo acceder a una variable global de Python desde C?

Aprecio que este no es un diseño muy bonito 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.

Respuesta

11

No soy un gurú de Python, pero encontré esta pregunta interesante, así que busqué en Google. This fue el primer éxito en "API de incrustación de Python". ¿Ayuda?

Si los atributos pertenecen a la alcance global de un módulo, entonces se puede utilizar "PyImport_AddModule" para conseguir una manija al objeto módulo. Por ejemplo, si que quería obtener el valor de un número entero en el módulo principal llamado "foobar", tendría que hacer lo siguiente:

PyObject *m = PyImport_AddModule("__main__"); 
PyObject *v = PyObject_GetAttrString(m,"foobar"); 

int foobar = PyInt_AsLong(v); 

Py_DECREF(v); 
+0

'Este' enlace está roto, ¿alguien tiene un enlace fijo? – leecbaker

+0

Se arregló - Es extraño que reorganizaran los archivos de la lista de esa manera, pero buscar el texto citado en Google encontró el mensaje con bastante facilidad. :-) –

0

recomiendo el uso de pyrex para hacer una extensión módulo en el que puede almacenar los valores en python, y cdef un conjunto 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 está tratando de transmitir.

0

¿Está dispuesto a modificar la API a poco?

  • Usted puede hacer la función de C devuelve el nuevo valor para el global y, a continuación, llamar de esta manera:

    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 está siempre en el mismo módulo, la solución de Sherm se ve muy bien
Cuestiones relacionadas