Hallo,
ich arbeite mit einem großen C-Programm zur Simulation von Strömungen,... das ganze ist in C geschrieben. Mitlerwiele programmiere ich nebenher recht viel, und sehr gerne in Pyhton. Ich möchte das bestehende C-Programm erweitern und ein neues Programm schreiben und beide miteinander koppeln, am liebsten würde ich das neue Programm in python schreiben.
Die beiden Programme müßten also miteinander kommunizieren und gegenseitig Daten
austauschen. Ich habe mal kurz etwas über embeding/extending python gelesen, aber noch nichts selber in der Richtung programmiert.
Hat jemand hier im Forum Erfahrungen in diesem Bereich ?
Wie gesagt ist es mehr als nur von C aus ein Pythonprogramm aufzurufen, vielmehr sollten beide nebenher laufen und gegenseitg Daten/Informationen austauschen.
Das ganze ist ziemlich komplex und ich will mich da auch nicht übernehmen, was denkt ihr ist das machbar ?
Sonst muß ich das vorhanden C-Programm eben mit einem weitern C-Porgramm erweitern,....
vielen Dank
Leo
Erfahrung erweiterung bestehender C Programme mit python
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Du wirst zumindest das Extending/Embedding Tutorial von docs.python.org durchlesen müssen. Darin lernst du, wie man ein Python-Erweiterungsmodul in C schreibt, mit eigenen Funktionen und Klassen.
Es ist gar nicht gesagt, daß embedding das richtige für Dich ist, wenn die Programme nebeneinander herlaufen sollen und Daten austauschen dann mußt Du dich eher mit Interprozesskommunikation befassen, z.B. über Sockets.
Emedding hat nachteile, da kannst Du z.B. das Script nicht einfach in Idle laufen lassen und debuggen, wenn Du nur programmintern extendest
Emedding hat nachteile, da kannst Du z.B. das Script nicht einfach in Idle laufen lassen und debuggen, wenn Du nur programmintern extendest
vielen Dank für die Antworten. Ich denke in meinem Fall geht es dann um sogenannte "Interprozesskommunikation". Da muß ich wohl über Sockets in Erfahrung bringen ?!
Von C aus nur mein Pythonskript aufrufen und python dann wieder zu schließen ist ja nicht das was ich möchte (so hatte ich die embeding verstanden). Ich möchte das die beiden Programme sich miteinander unterhalten während sie parallel laufen.
Dann werde ich mal googlen vielen Dank für die Tipps.
Von C aus nur mein Pythonskript aufrufen und python dann wieder zu schließen ist ja nicht das was ich möchte (so hatte ich die embeding verstanden). Ich möchte das die beiden Programme sich miteinander unterhalten während sie parallel laufen.
Dann werde ich mal googlen vielen Dank für die Tipps.
Statt ein eigenes Protokoll über Sockets laufen zu lassen, könntest Du auch XML-RPC, JSON-RPC oder Corba für die Kommunikation benutzen.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Und außer für die CORBA-Module (wenn überhaupt für die) braucht man keinen C-Compiler. In der Regel reicht das Entpacken der Packages in einen Pfad wo Python sie findet.iwl hat geschrieben:Dafür muß man dann sicher unter Phyton noch Module installieren, die das unterstützen und auf für den C-Compiler entsprechendes haben?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hallo,
ich versuche mich gerade doch zuerst mit embedding, komme aber richtig vorran ich habe im web einige Beispiele gefunden
Ich schaffe es schon das ich von meinem C-Programm aus Python aufrufe und ein "Hallo Welt" über Python ausgegben wird . Das war ganz schön schwierig weil ich ein passendes Makefile dazu gebraucht habe.
Wie man aber eigene Python-Skripte von C aus aufruft und ausführt verstehe ich leider noch nicht.
Kennt hier jemand ein gutes Besipiel (Code)/ Tutorial möglichst auf deutsch ?
Ich möchte einfach einen Array mit Daten an die gewünschte Pythonfunktion übergeben und andere Werte zurück bekommen. Das Modul liegt im selben Verzeichniss z.B. test.py.
C-Code:
Danke
ich versuche mich gerade doch zuerst mit embedding, komme aber richtig vorran ich habe im web einige Beispiele gefunden
Ich schaffe es schon das ich von meinem C-Programm aus Python aufrufe und ein "Hallo Welt" über Python ausgegben wird . Das war ganz schön schwierig weil ich ein passendes Makefile dazu gebraucht habe.
Wie man aber eigene Python-Skripte von C aus aufruft und ausführt verstehe ich leider noch nicht.
Kennt hier jemand ein gutes Besipiel (Code)/ Tutorial möglichst auf deutsch ?
Ich möchte einfach einen Array mit Daten an die gewünschte Pythonfunktion übergeben und andere Werte zurück bekommen. Das Modul liegt im selben Verzeichniss z.B. test.py.
C-Code:
Code: Alles auswählen
int testpython(double number){
// initialize the interpreter
Py_Initialize();
// evaluate some code
PyRun_SimpleString("import sys\n");
//ignore line wrap on following line
PyRun_SimpleString("sys.stdout.write('Hello from an embedded Python Script\\n\\n')\n");
// shut down the interpreter
Py_Finalize();
return 0;
}
Danke
Leider kann ich dir da nicht etwas vorbereiten da mir selber etwas die Zeit fehlt.
Aber die Interaktion mit einem embedded Python ist unter anderem hier erklärt: http://docs.python.org/ext/pure-embedding.html
Hier wird gezeigt wie man sich aus einer Python-Funktion einen Integerwert zurück geben kann.
Wenn man den ganzen argv-Kram erst mal nicht braucht, den raus filtert und nachguckt wie die Methoden sind um Arrays zwischen Python und der umgebenen C-Applikation auszutauschen, sollte das funktionieren.
Ist leider keine deutsche Hilfe, aber ich denke das könnte helfen.
Aber die Interaktion mit einem embedded Python ist unter anderem hier erklärt: http://docs.python.org/ext/pure-embedding.html
Hier wird gezeigt wie man sich aus einer Python-Funktion einen Integerwert zurück geben kann.
Wenn man den ganzen argv-Kram erst mal nicht braucht, den raus filtert und nachguckt wie die Methoden sind um Arrays zwischen Python und der umgebenen C-Applikation auszutauschen, sollte das funktionieren.
Ist leider keine deutsche Hilfe, aber ich denke das könnte helfen.
Ah, alles klar, vielen Dank ich glaube ich blicke es jetzt, ich hatte die Sache mir dem übergeben von argc / argv[] nicht verstanden. Das sind einfach Sachen die ich direkt bei einm Komandozeilenaufruf an das Programm übergeben würde.
Wie peinlich das ich das nicht kapiert habe, in meinem Fall rufe ich das ganze innerhalb einer funktion in einem c-Programm auf, es wird also kein argv, etc übergeben.
Ich bin nicht sehr gut im C programmieren, mir will es nicht gelingen die mit argv[] übergebenen Sachen zu ersetzen.
Beispiel:
pModule = PyString_FromString(argv[1]);
Ich müßte jetzt argv[1] durch einen Namen ersetzen der aus einem string besteht. In meinem C-Programm habe ich z.B ein char dafür verwendet:
char name[] = "namepython";
wie bekomme ich das jetzt so hin das der char passend umgewandelt wird ?
pModuile = PyString_FromString(???);
ich stehe gearde auf dem Schlauch und bin um jede Hilfe dankbar,... werde nochmal mein C-Buch durcharbeiten
Wie peinlich das ich das nicht kapiert habe, in meinem Fall rufe ich das ganze innerhalb einer funktion in einem c-Programm auf, es wird also kein argv, etc übergeben.
Ich bin nicht sehr gut im C programmieren, mir will es nicht gelingen die mit argv[] übergebenen Sachen zu ersetzen.
Beispiel:
pModule = PyString_FromString(argv[1]);
Ich müßte jetzt argv[1] durch einen Namen ersetzen der aus einem string besteht. In meinem C-Programm habe ich z.B ein char dafür verwendet:
char name[] = "namepython";
wie bekomme ich das jetzt so hin das der char passend umgewandelt wird ?
pModuile = PyString_FromString(???);
ich stehe gearde auf dem Schlauch und bin um jede Hilfe dankbar,... werde nochmal mein C-Buch durcharbeiten
Was meinste da mit überschreiben?
argv[1] wäre der erste Parameter (nach dem Applikationsnamen selber) der deiner main() beim Programmstart übergeben wird.
Einen fest eintragen?
Beim festen eintragen würde ich jetzt erwarten das das So funktioniert wenn du
übergeben würdest
Bekommst du dann einen Fehler oder wird der name also der Sting nicht im Objekt abgespeichert?!
Alternativ würd ich mal testen wenn du nur einen Pointer übergibst.
Laut definition wird const char * erwartet.
Ansonsten sag mal den Fehler der raus kommt, würde mich echt mal interssieren
argv[1] wäre der erste Parameter (nach dem Applikationsnamen selber) der deiner main() beim Programmstart übergeben wird.
Einen fest eintragen?
Beim festen eintragen würde ich jetzt erwarten das das So funktioniert wenn du
Code: Alles auswählen
pModule = PyString_FromString(name);
Bekommst du dann einen Fehler oder wird der name also der Sting nicht im Objekt abgespeichert?!
Alternativ würd ich mal testen wenn du nur einen Pointer übergibst.
Code: Alles auswählen
char name[] = "namepython";
const char * p_name= name;
pModule = PyString_FromString(p_name);
Ansonsten sag mal den Fehler der raus kommt, würde mich echt mal interssieren
Ich habe ncoh etwas wichtiges herausgefunden das allen die sich mit embedding python beschäftigen sicher helfen wird. Das Beispiel in der Dokumentation ist nicht ganz vollständig (das hätte mir beinahe das Genick gebrochen).
http://docs.python.org/ext/pure-embedding.html
hier fehlt etwas im C-Code, python sucht sonst im flaschen Pfad ich habe die Lösung in der Mailingliste unter http://mail.python.org/pipermail/python ... 87421.html gefunden.
http://docs.python.org/ext/pure-embedding.html
hier fehlt etwas im C-Code, python sucht sonst im flaschen Pfad ich habe die Lösung in der Mailingliste unter http://mail.python.org/pipermail/python ... 87421.html gefunden.
iHere is what I had to do to make the code work correctly...
Right after Py_Initialize in the C code, I added the following two
lines...
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.insert(0, '')");
The problem was Python wasn't looking for the module in the current
directory.