9 Stimmen

Wie greift man von C aus auf eine globale Python-Variable zu?

Ich habe einige globale Variablen in einem Python-Skript. Einige Funktionen in diesem Skript rufen in C - ist es möglich, eine dieser Variablen zu setzen, während in C und wenn ja, wie?

Mir ist klar, dass dies nicht gerade ein schönes Design ist, aber ich muss eine kleine Änderung am bestehenden Code vornehmen und möchte keine größere Umstrukturierung der bestehenden Skripte vornehmen.

0 Stimmen

Ich denke, was Sie mit globaler Variable meinten, ist nur die __main__ der globalen Variablen des Moduls. Eigentlich hat jedes importierte Python-Modul seine eigenen globalen Variablen. Eingebaute Funktion Globale

15voto

Sherm Pendley Punkte 13486

Ich bin kein Python-Guru, aber ich fand diese Frage interessant, also googelte ich herum. Diese war der erste Treffer bei der Suche nach "python embedding API" - ist das hilfreich?

Gehören die Attribute zur globalen Bereich eines Moduls gehören, dann können Sie mit "PyImport_AddModule" verwenden, um ein Handle auf das Modulobjekt zu erhalten. Wenn Sie zum Beispiel Sie den Wert einer Ganzzahl im Modul Haupt Modul namens "foobar", würden Sie folgendes tun:

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

int foobar = PyInt_AsLong(v);

Py_DECREF(v);

0 Stimmen

Dieser" Link ist defekt - hat jemand einen festen Link?

0 Stimmen

Behoben - Seltsam, dass sie die Listenarchive auf diese Weise neu anordnen, aber wenn man nach dem zitierten Text googelt, findet man die Nachricht leicht :-)

6voto

Praxeolitic Punkte 19598

Für alle, die von Google hierher kommen, hier ist die direkte Methode:

PyObject* PyEval_GetGlobals()

https://docs.python.org/2/c-api/reflection.html

https://docs.python.org/3/c-api/reflection.html

Auf den Rückgabewert wird in Form eines Wörterbuchs zugegriffen.

0voto

orip Punkte 69138

Sind Sie bereit, die API zu modifizieren? kleines bisschen ?

  • Sie können die C-Funktion dazu bringen, den neuen Wert für das Global zurückzugeben, und sie dann wie folgt aufrufen:

    my_global = my_c_func(...)

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

  • Wenn sich Ihr Global immer im selben Modul befindet, ist die Lösung von Sherm ideal

-1voto

Alex Coventry Punkte 64405

Ich empfehle die Verwendung von pyrex um ein Erweiterungsmodul zu erstellen, in dem Sie die Werte in Python speichern können, und eine Reihe von Funktionen zu definieren, die von C aus aufgerufen werden können, um die Werte dort zurückzugeben.

Ansonsten hängt viel von der Art der Werte ab, die Sie übermitteln wollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X