Erfahrung erweiterung bestehender C Programme mit python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

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
Benutzeravatar
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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
iwl
User
Beiträge: 12
Registriert: Samstag 9. Dezember 2006, 16:11

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
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

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.
BlackJack

Statt ein eigenes Protokoll über Sockets laufen zu lassen, könntest Du auch XML-RPC, JSON-RPC oder Corba für die Kommunikation benutzen.
iwl
User
Beiträge: 12
Registriert: Samstag 9. Dezember 2006, 16:11

Dafür muß man dann sicher unter Phyton noch Module installieren, die das unterstützen und auf für den C-Compiler entsprechendes haben?
BlackJack

Für XML-RPC gibt's bei Python schon ein Modul.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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?
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

nochmals vielen Dank da werde ich mich zunächst mal schlau machen welche Variante die Beste bzw. einfachste ist.
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

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 :D . 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
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

Ah, alles klar, vielen Dank ich glaube ich blicke es jetzt, :D 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 :oops: 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 :cry:
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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

Code: Alles auswählen

pModule = PyString_FromString(name); 
ü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.

Code: Alles auswählen

char name[] = "namepython"; 
const char * p_name= name;
pModule = PyString_FromString(p_name); 
Laut definition wird const char * erwartet.
Ansonsten sag mal den Fehler der raus kommt, würde mich echt mal interssieren
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

vielen Dank für die Hilfe, die 2te Variante mit const char* funktioniert
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

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.
Here 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.
i
Antworten