Python Konsolenausschnitte ausführen
Verfasst: Mittwoch 31. März 2010, 15:35
Bei Beispielen in Dokumentation ist es ja oft so, dass ein paar Zeilen aus der Interpreter-Session einfach in den Text reinkopiert werden. An sich ist das auch recht anschaulich, aber wenn man den gezeigten Code mal ausprobieren will und zu faul ist, alles abzuschreiben, wird Copy&Paste nervig, da man den Interpreter-Prompt händisch wieder rauskriegen muss.
Das folgende Skript nimmt an, dass es alle Vorkommen von `>>>` bzw. `...` am Zeilenanfang als Prompt interpretieren und daher löschen darf. Zusätzlich werden Zeilen, die mit keins von beiden anfangen, komplett gelöscht. Das hat den Vorteil, dass etwaige Rückgabewerte rausgenommen werden und man das bereinigte Ergebnis direkt via `exec` ausführen oder irgendwo zum späteren Ausführen zwischenspeichern kann.
Wer `xsel` installiert hat (also i.d.R. Linux-User), braucht eigentlich nur den gewünschten Code in die Zwischenablage zu kopieren und die Hauptfunktion des Skriptes auszuführen, da dann die Ausgabe des besagten Programms (also Clipboard-Inhalt) zum Bereinigen genommen wird. Windows-Benutzer müssen die Konsolenausgabe leider händisch übergeben - zumindest solange es keine "Paste-Funktion" für sie gibt...
Was man noch machen könnte, wären Kommandozeilen-Parameter. Aktuell wird bei einem Ausführen "von Außen" standardmäßig das "Tastatur-Clipboard" verwendet (`xsel -b`). Vielleicht nutzt der Ein oder andere aber auch lieber die mittlere Maustaste für solche Aktionen oder möchte gar nichts mit der Zwischenablage machen, sondern nur die Ausgabe sehen. Außerdem finde ich den Weg, wie ich in die Pipe von `xsel` schreibe, nicht so toll. Ich denke, das geht doch bestimmt auch ohne `echo`.
Das folgende Skript nimmt an, dass es alle Vorkommen von `>>>` bzw. `...` am Zeilenanfang als Prompt interpretieren und daher löschen darf. Zusätzlich werden Zeilen, die mit keins von beiden anfangen, komplett gelöscht. Das hat den Vorteil, dass etwaige Rückgabewerte rausgenommen werden und man das bereinigte Ergebnis direkt via `exec` ausführen oder irgendwo zum späteren Ausführen zwischenspeichern kann.
Wer `xsel` installiert hat (also i.d.R. Linux-User), braucht eigentlich nur den gewünschten Code in die Zwischenablage zu kopieren und die Hauptfunktion des Skriptes auszuführen, da dann die Ausgabe des besagten Programms (also Clipboard-Inhalt) zum Bereinigen genommen wird. Windows-Benutzer müssen die Konsolenausgabe leider händisch übergeben - zumindest solange es keine "Paste-Funktion" für sie gibt...
Was man noch machen könnte, wären Kommandozeilen-Parameter. Aktuell wird bei einem Ausführen "von Außen" standardmäßig das "Tastatur-Clipboard" verwendet (`xsel -b`). Vielleicht nutzt der Ein oder andere aber auch lieber die mittlere Maustaste für solche Aktionen oder möchte gar nichts mit der Zwischenablage machen, sondern nur die Ausgabe sehen. Außerdem finde ich den Weg, wie ich in die Pipe von `xsel` schreibe, nicht so toll. Ich denke, das geht doch bestimmt auch ohne `echo`.
Code: Alles auswählen
from subprocess import Popen, PIPE
def _get_clipboard_contents():
xsel = Popen(['xsel', '-b'], stdout=PIPE)
clipboard_contents = xsel.communicate()[0]
return clipboard_contents
def _write_to_clipboard(s):
echo = Popen(['echo', s], stdout=PIPE)
xsel = Popen(['xsel', '-b', '-i'], stdin=echo.stdout, stdout=PIPE)
xsel.communicate()
def pycon2source(s=None, copy_result=True):
s = s or _get_clipboard_contents()
result = '\n'.join(
line[4:] for line in s.splitlines()
if line.startswith(('>>>', '...'))
)
if copy_result:
_write_to_clipboard(result)
return result
if __name__ == '__main__':
print pycon2source()