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

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

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

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

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

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

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