2008-11-12 12 views
6

Ich habe einige globale Variablen in einem Python-Skript. Einige Funktionen in diesem Skript rufen C auf - ist es möglich, eine dieser Variablen in C zu setzen, und wenn ja, wie?Wie Zugriff auf eine globale Python-Variable von C?

Ich weiß zu schätzen, dass dies in erster Linie kein sehr schönes Design ist, aber ich muss eine kleine Änderung am bestehenden Code vornehmen, ich möchte mich nicht auf ein größeres Refactoring bestehender Skripte einlassen.

Antwort

11

Ich bin kein Python-Guru, aber ich fand diese Frage interessant, also habe ich gegoogelt. This war der erste Hit auf "Python Embedding API" - hilft es?

Wenn die Attribute für den globalen Rahmen eines Moduls gehören, dann können Sie „PyImport_AddModule“ verwenden, um einen Griff an das Modul-Objekt zu erhalten. Zum Beispiel, wenn wollten Sie den Wert eines ganze Zahl im Haupt Modul „foobar“ genannt bekommen, würden Sie wie folgt vorgehen:

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

int foobar = PyInt_AsLong(v); 

Py_DECREF(v); 
+0

'Dieser' Link ist kaputt - hat jemand eine feste Verbindung? – leecbaker

+0

Fehler behoben - Seltsam, dass sie die Listenarchive so umordnen würden, aber googeln nach dem zitierten Text fand die Nachricht einfach genug. :-) –

0

I pyrex empfehlen eine Verlängerung machen Modul Sie können die Werte in Python speichern, und Cdef eine Reihe von Funktionen, die von C aufgerufen werden können, um die Werte dort zurückzugeben.

Ansonsten hängt vieles von der Art der Werte ab, die Sie übertragen möchten.

0

Sind Sie bereit, die API ein wenig zu ändern?

  • Sie können die C-Funktion machen den neuen Wert für die globale zurückkehren, und dann rufen Sie wie folgt aus:

    my_global = my_c_func(...)

  • Wenn Sie direkt Robin oder die Python-C-API verwenden Sie können das Globals-Wörterbuch als zusätzlichen Parameter übergeben und ändern

  • Wenn Ihre globale ist immer in dem gleichen Modul, Sherm Lösung sieht gut aus
Verwandte Themen