Programmkontrolle 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.
MiBSchmidt
User
Beiträge: 2
Registriert: Samstag 21. Juni 2003, 18:59

Programmkontrolle mit Python

Beitragvon MiBSchmidt » Samstag 21. Juni 2003, 19:11

Hallo

ich habe folgendes Problem. Ich möchte den gdb mit Hilfe eines python scripts starten und steuern. Dabei soll das script zunächst nur den gdb starten ('gdb'), anschließend die Hilfe ausgeben ('help') und dann den gdb beenden ('quit')

Das Starten ist eigentlich kein Problem. Im Web und auch hier im Forum hab ich gesehen , dass das mit os.system, popen usw. möglich ist. Leider habe ich noch keine Möglichkeit gefunden, wie ich nach dem Starten des GDB, Befehle an diesen senden kann. Vielleicht kann mir jemand dabei helfen.

Danke !!!
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Re: Programmkontrolle mit Python

Beitragvon Milan » Samstag 21. Juni 2003, 19:23

MiBSchmidt hat geschrieben:Das Starten ist eigentlich kein Problem. Im Web und auch hier im Forum hab ich gesehen , dass das mit os.system, popen usw. möglich ist. Leider habe ich noch keine Möglichkeit gefunden, wie ich nach dem Starten des GDB, Befehle an diesen senden kann. Vielleicht kann mir jemand dabei helfen.


Wenn du ihn mit os.popen3 bzw popen2.popen3 startest kannst du noch Kommandos hinterherwerfen, theoretisch so:

Code: Alles auswählen

import popen2
ch_out,ch_in,ch_err=popen2.popen3('gdb')
ch_in.write('help\n')
ch_in.write('quit\n')
ch_in.close()
MiBSchmidt
User
Beiträge: 2
Registriert: Samstag 21. Juni 2003, 18:59

Beitragvon MiBSchmidt » Samstag 21. Juni 2003, 19:49

Hallo Milan

Danke für die super schnelle Antwort

Habe deine code ausprobiert und ich denkemal erfunktioniert. Ich kann das nicht genau sagen, da die Antwort des gdb ja jetzt in ch_out stehen müßte. Ich habe dann versucht das Sript wie folgt zu erweitern:

Code: Alles auswählen

import sys,os,popen2,string
cmd = 'gdb'
ch_out,ch_in,ch_err=popen2.popen3(cmd)

line = ch_out.readlines()
print "%s" (line)
ch_out.close()

ch_in.write('help\n')
ch_in.write('quit\n')
ch_in.close()

Leider bleibt das script stehen wenn ich es ausführe. Kannst du mir sagen was ich falsch mache?
Danke
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Samstag 21. Juni 2003, 20:15

Hi,
wenn du was etwas aus ch_out auslesen willst, wartet dein Script natürlich bis es was zu auslesen gibt, also wahrscheinlich bis gdb zu Ende ist. Lass also mal zuerst die eingabe machen und schau dann, was zurückgegeben wird (einfach die zwei Blöcke vertauschen). Du musst auch ch_out nicht nach dem auslesen schließen, ich hab das bei mir im Beispiel getan, weil es sonst manchmal bei mir nicht funktioniert (Bsp: versenden von Mails mit sendmail).

Milan
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Beitragvon Voges » Samstag 21. Juni 2003, 20:29

Hallo!
Sowas mit Bordmitteln zu realisieren, wird heftig, vermute ich mal. Abseits von Python macht man sowas (Automation von interaktiven Anwendungen) mit expect.
Ich hab' eben einen Python-Port gefunden, der einen guten Eindruck macht. Quelle: http://pexpect.sourceforge.net

Code: Alles auswählen

>>> import pexpect
>>> child = pexpect.spawn('gdb')
>>> child.expect('\(gdb\)')
0
>>> child.sendline('help')
5
>>> child.expect('\(gdb\)')
0
>>> child.before
' help\r\nList of classes of commands:\r\n\r\naliases -- Aliases
of other commands\r\nbreakpoints -- Making program stop at certain
points\r\ndata -- Examining data\r\nfiles -- Specifying and examining
files\r\ninternals -- Maintenance commands\r\nobscure -- Obscure
features\r\nrunning -- Running the program\r\nstack -- Examining the
stack\r\nstatus -- Status inquiries\r\nsupport -- Support
facilities\r\ntracepoints -- Tracing of program execution without
stopping the program\r\ntui -- Text User Interface commands\r\nuser-
defined -- User-defined commands\r\n\r\nType "help" followed by a class
name for a list of commands in that class.\r\nType "help" followed by
command name for full documentation.\r\nCommand name abbreviations are
allowed if unambiguous.\r\n'
>>>

Jan
flea

Beitragvon flea » Dienstag 24. Juni 2003, 10:12

MiBSchmidt hat geschrieben:

Code: Alles auswählen

import sys,os,popen2,string
cmd = 'gdb'
ch_out,ch_in,ch_err=popen2.popen3(cmd)

line = ch_out.readlines()
print "%s" (line)
ch_out.close()

ch_in.write('help\n')
ch_in.write('quit\n')
ch_in.close()

Leider bleibt das script stehen wenn ich es ausführe. Kannst du mir sagen was ich falsch mache?
Danke


string.readlines() wartet auf EOF.
Das kommt erst, wenn der Prozess beendet wird.
Du kannst stattdessen in einer Schleife mit string.readline() die Zeilen einzeln einlesen...

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder