2017-01-13 3 views
0

Ich möchte mehrere Shell-Befehle nacheinander ausführen. Die Befehle werden von einem Remote-Gerät über den Socket empfangen. Was ich tun muss, ist eine Shell zu erstellen, die remote zugänglich ist. Mit subprocess.Popen kann ich Befehle ausführen und Ausgabe erhalten. Aber wenn ich cd MyDIR und dann ls -l ausführen möchte. Wenn ich es als 2 Codezeilen ausführe, erhalte ich eine Dateiauflistung des übergeordneten Verzeichnisses statt des Verzeichnisses, in das ich mich eingewählt habe. Die Verwendung von cd MyDIR && ls -l ergibt das erforderliche Ergebnis. Wenn ich die Kommunikationsmethode verwende, bekomme ich kein Ergebnis und auch die Standardeingabe wird geschlossen. Kann mir jemand mit einem Code helfen?Python - Mehrere Shell-Befehle nacheinander ausführen

bearbeiten

Die hier Interacting with bash from python gegebene Lösung löst nicht mein Problem, wie ich die Schale so lange aktiv, wie möglich und so viel halten will, wie gebraucht. Der Versuch, die Lösung auf dieser Seite gibt eine Meldung, die IO operation on closed file.

+0

Mögliche Duplikat von [Interagieren mit bash von Python] (http hilft: // Stackoverflow. com/questions/9673730/interacting-with-bash-from-python) –

+0

@PatrickHaugh Ja, es sieht aus wie ein Duplikat, aber ich möchte den Fehler 'IO-Operation bei geschlossener Datei' lösen. Ich möchte die Kommunikation aktiv halten. –

+0

Sieht aus wie es einfacher gemacht werden kann, wenn Sie mit bash hören. Nur 'nc -k -l 4444 | Bash'. – Raz

Antwort

0

Dieser Code

from subprocess import Popen, PIPE 
from time import sleep 
from fcntl import fcntl, F_GETFL, F_SETFL 
from os import O_NONBLOCK, read 

# run the shell as a subprocess: 
p = Popen(['python', 'shell.py'], 
     stdin = PIPE, stdout = PIPE, stderr = PIPE, shell = False) 
# set the O_NONBLOCK flag of p.stdout file descriptor: 
flags = fcntl(p.stdout, F_GETFL) # get current p.stdout flags 
fcntl(p.stdout, F_SETFL, flags | O_NONBLOCK) 
# issue command: 
p.stdin.write('command\n') 
# let the shell output the result: 
sleep(0.1) 
# get the output 
while True: 
    try: 
     print read(p.stdout.fileno(), 1024), 
    except OSError: 
     # the os throws an exception if there is no data 
     print '[No more data]' 
     break 

Hier ist die Quelle http://eyalarubas.com/python-subproc-nonblock.html

Verwandte Themen