[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