[Python-de] Einbinden eines Pythonskriptes in C++

Marcus m_konermann at gmx.de
Wed May 15 03:36:45 EDT 2002


Hallo !

Bin nach etlichen Neuinstallation meiner Python version doch schon recht 
verzweifelt. 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. Da 
ich mal von ausgehe, dass das Programm laufen sollte, muss es entweder 
an meiner Python Installation oder an meiner Compilereinstellung liegen.
Vielleicht hat jemand die Möglichkeit, nachfolgendes Listing der beiden 
Dateien mal bei sich zu testen.
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");
    ln = PyObject_GetAttrString(module,    "lastName");
    prof = PyObject_GetAttrString(module, "profession");

    /*Nun noch konvertieren */
    *firstName = PyString_AsString(fn);
    *lastName = PyString_AsString(ln);
    *profession = PyString_AsString(prof);
}

void doComplicatedStuff(char *firstName, char *lastName, char *profession){

    /*Datenbank o.Ae.

    printf("Werte %s %s %s\n", firstName, lastName, profession);*/
}

void main(int argc, char *argv[]) {

    char *firstName, *lastName, *profession;
    Py_Initialize();
    PySys_SetArgv(argc, argv);
    getValues(&firstName, &lastName, &profession);
    /*doComplicatedStuff(firstName, lastName, profession);*/
    Py_Exit(0);
}

und hier ist das Python Skript, welches ich aufrufen möchte:


import Tkinter
import sys
import pdb

def ready():
    global firstName, lastName, profession
    global fn, ln, p

    firstname=fn.get()
    lastName=ln.get()
    profession=p.get()
    root.destroy()

def init():
    global fn, ln, p, root

    root = Tkinter.Tk()

    fn = Tkinter.StringVar()
    ln = Tkinter.StringVar()
    p = Tkinter.StringVar()

    #pdb.set_trace()
    top = Tkinter.Frame(master=root)
    top.pack(side= 'top')
    bottom=Tkinter.Frame(master=root)
    bottom.pack(side='bottom', fill= 'x')
    m=Tkinter.Message(master=top, width="4c",
                      justify="left",
                      font="Times 14 bold", text=
                      "Bitte geben Sie folgende Daten ein"
                      " und druecken Sie dann bitte Eingabe")
    m.pack(side='left')
    input=Tkinter.Frame(master=top)
    input.pack(side='right')

    Tkinter.Label(master=input,
                  text='Vorname').grid(row=0, column=0)
    Tkinter.Label(master=input,
                  text='Nachname').grid(row=1, column=0)
    Tkinter.Label(master=input,
                  text='Beruf').grid(row=2, column=0)

    Tkinter.Entry(master=input,
                  textvariable=fn).grid(row=0, column=1)
    Tkinter.Entry(master=input,
                  textvariable=ln).grid(row=1, column=1)
    Tkinter.Entry(master=input,
                  textvariable=p).grid(row=2, column=1)

    Tkinter.Button(master=bottom, text="Eingabe",
                   command=ready).pack(side='right')

    root.mainloop()

init()

Vielleicht hat ja jemand schon mal einen ähnlichen Fehler bekommen und 
weiss Rat.

Vielen Dank für die Hilfe
Marcus






More information about the Python-de mailing list