2016-10-29 3 views
0

Wenn ich stdout übernehme, mit einem interaktiven Python-Skript, das eine Konsolen-GUI wie curses oder urwid startet; nach einigen Aktionen und Schließen der Schleife, wie könnte ich cd zu einem Pfad in stdout gedruckt werden?Stdout aus der interaktiven Python-Anwendung an den Befehl cd übergeben (subshell?)

Zum Beispiel

import sys 
import urwid 

def check_for_q(key): 
    if key in ('q', 'Q'): 
     raise urwid.ExitMainLoop() 

txt = urwid.Text(u"Thanks for helping") 
fill = urwid.Filler(txt, 'top') 
loop = urwid.MainLoop(fill, unhandled_input=check_for_q) 
loop.run() 

sys.stdout.write('/usr/bin') 

Sobald er ausgeführt wird, und q oder Q Drücken die urwid Schleife zu beenden:

(py27) $ python curses_script.py 

/usr/bin 

(py27) $ 

Wenn dies ein einfacher Python-Skript ist, die nur auf stdout gedruckt, kann ich cd $(python simple_script.py). Mit dem oben genannten wird jedoch hängen, da die Python-Subshell stdout nicht entführen und Eingabe verarbeiten kann.

Ist es möglich, dies zu umgehen, ohne in eine Datei zu schreiben?

+0

Der Ansatz, den ich vor genommen haben, ist ein wenig Bash-Skript, das Einwickeln der Python-Skript zu erstellen. Das Bash-Skript erstellt eine temporäre Datei oder eine Named Pipe, übergibt den Pfad dieser Datei an das Python-Skript als Befehlszeilenargument und liest und löscht anschließend die Datei, wenn das Python-Skript beendet ist. – jme

+0

@jme Ich würde es eher vermeiden, sich auf die Erstellung von temporären Dateien zu verlassen und sie später zu löschen. Ich habe noch nie zuvor named pipes benutzt und werde in diese hineinschauen. Ein Beispiel zur Veranschaulichung wäre fantastisch! – Kappers

+0

Warum möchten Sie die Erstellung von temporären Dateien vermeiden? Die Verwendung von Dateien auf diese Weise ist ziemlich konsistent mit der Unix-Philosophie. Darüber hinaus sind Named Pipes im Wesentlichen Dateien (es gibt einige Beispiele, wie sie auf dieser Site verwendet werden). – jme

Antwort

0

Statt einige Bash schwarze Magie zu tun, das ist ziemlich leicht erreicht werden könnte, und das ist eine Arbeitslösung

temp_file=$(mktemp /tmp/curses_script.XXXXXX) 
python curses_script.py temp_file 
# write to temp file in script... 
cd $(cat temp_file) 
rm $temp_file 
Verwandte Themen