[Python-de] Einbinden eines Pythonskriptes in C++
Gerhard Häring
haering_python at gmx.de
Wed May 15 04:29:57 EDT 2002
* Marcus <m_konermann at gmx.de> [2002-05-15 02:36 +0200]:
> Hallo !
>
> Bin nach etlichen Neuinstallation meiner Python version doch schon
> recht verzweifelt.
Die Konditionierung durch Benutzung von Windows hat offensichtlich
funktioniert. Zur Fehlersuche in eigenem (!) C Code hilft ein Debugger,
Doku und in ähnlichen, funktionierenden Code reinzuschauen.
> Ich versuche vergebens ein Beispiel aus dem Buch von Tobis Himstedt
> "Mit Python programmieren" ans laufen zu bekommen. In dem Beispiel
> soll C Sourcecode mit einem Python Skript erweitert werden. Nur aus
> unerfindlichen Gründen bekomme ich es nicht an laufen. Es treten
> häufig Speicherzugriffsfehler auf.
Ja, es ist halt C.
> Da ich mal von ausgehe, dass das Programm laufen sollte, muss es
> entweder an meiner Python Installation oder an meiner
> Compilereinstellung liegen.
Nein, an buggy C Code, der fast gänzlich ohne Fehlerchecks daherkommt.
> Vielleicht hat jemand die Möglichkeit, nachfolgendes Listing der beiden
> Dateien mal bei sich zu testen.
Hab ich gemacht. Segfaulted unter Linux, weil er die gesuchten Attribute
nicht in __main__ findet. Mir gefällt der Ansatz, so zwischen einem
C-Hauptprogramm und einem Python-Skript zu kommunizieren, eh nicht. Als
Übung mag's ja vielleicht ganz gut sein ...
> Hier das vollständige Listing beider Dateien:
>
> #include <Python.h>
> #include <stdlib.h>
>
> void getValues(char **firstName, char **lastName, char **profession) {
>
> FILE *fp = NULL;
> PyObject *module, *fn, *ln, *prof;
> int res;
>
> /* Das getValues.py-Skript laeuft im Namespace des
> __main__ Moduls. Daher muss dieses Modul erstmal ermittelt werden*/
> module = PyImport_AddModule("__main__");
>
> /* Das Skript ausfuehren, dass die Dateneingabe erledigt */
> fp = fopen("getValues.py","r");
> res = PyRun_SimpleFile(fp,"getValues.py");
> if (res == -1) {
> puts("Error");
> exit(1);
> }
>
> /* Nun koennen die Variablen ausgelesen werden*/
> /* Sie sind Attribute von __main__*/
>
> fn = PyObject_GetAttrString(module, "firstName");
Hier fehlt die Überprüfung, ob das Attribut gefunden wurde, also ein:
if (!fn)
oder if (fn != (PyObject*)NULL)
> [...]
Ich würde empfehlen, das Python-Skript in ein Modul umzuschreiben, mit
einer aufrufbaren Funktion, welche ein Dictionary zurückliefert. Im
C-Programm kannst du dann das Modul importieren, die Funktion aufrufen
und das zurückgelieferte Dictionary abfragen.
Gerhard
--
This sig powered by Python!
Außentemperatur in München: 11.5 °C Wind: 1.7 m/s
More information about the Python-de
mailing list