2 Stimmen

Skripting und interaktiver Terminal-Client in Python

Ich muss ein Skript/einen interaktiven Terminal-Client mit Python automatisieren. Der Client akzeptiert drei Argumente und läuft wie folgt ab:

>./myclient <arg1> <arg2> <arg3>
Welcome...
blah...
blah..
[user input]
some more blah... blah... for the input entered
blah.. 
blah..
[basically it accepts input and puts the output in the console until the user types 'quit']

Nun muss ich dies in Python automatisieren und die Konsolenausgabe in einer Datei speichern.

7voto

Schauen Sie doch mal unter http://docs.python.org/library/cmd.html .

Beispiel-Code:

import cmd
import sys

class Prompt(cmd.Cmd):
    def __init__(self, stufflist=[]):
        cmd.Cmd.__init__(self)
        self.prompt = '>>> '
        self.stufflist = stufflist
        print "Hello, I am your new commandline prompt! 'help' yourself!"

    def do_quit(self, arg):
        sys.exit(0)

    def do_print_stuff(self, arg):
        for s in self.stufflist:
            print s

p = Prompt(sys.argv[1:])
p.cmdloop()

Beispieltest:

$ python cmdtest.py foo bar
Hello, I am your new commandline prompt! 'help' yourself!
>>> help

Undocumented commands:
======================
help  print_stuff  quit

>>> print_stuff
foo
bar
>>> quit

Um die Ausgabe in eine Datei zu speichern, können Sie das, was normalerweise an stdout geht, auch in eine Datei schreiben, zum Beispiel mit dieser Klasse:

class Tee(object):
    def __init__(self, out1, out2):
        self.out1 = out1
        self.out2 = out2

    def write(self, s):
        self.out1.write(s)
        self.out2.write(s)

    def flush(self):
        self.out1.flush()
        self.out2.flush()

Sie können ihn wie folgt verwenden:

with open('cmdtest.out', 'w') as f:
    # write stdout to file and stdout
    t = Tee(f, sys.stdout)
    sys.stdout = t

Ein Problem ist, dass die Befehle, die über stdin eingelesen werden, nicht in dieser Ausgabe erscheinen, aber ich glaube, dass dies leicht gelöst werden kann.

7voto

dnaq Punkte 1984

Sie möchten wahrscheinlich erwarten (eine reine Python-Version des altehrwürdigen expect).

import pexpect
proc = pexpect.spawn('./myclient <arg1> <arg2> <arg3>')
proc.logfile = the_logfile_you_want_to_use
proc.expect(['the string that tells you that myclient is waiting for input'])
proc.sendline('line you want to send to myclient')
proc.expect(['another line you want to wait for'])
proc.sendline('quit') # for myclient to quit
proc.expect([pexpect.EOF])

So etwas sollte ausreichen, um Ihren Fall zu lösen. pexpect kann aber noch viel mehr, also lesen Sie die Dokumentation für fortgeschrittene Anwendungsfälle.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X