Code: Alles auswählen
process = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Kann mir wer unter die Arme greifen?
Code: Alles auswählen
process = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Code: Alles auswählen
>>> p = subprocess.Popen("/bin/ls")
einfuehrung.pdf einfuehrung.tex
>>> p.returncode
>>> p.returncode
>>> p.returncode
>>> p.returncode
>>> p.returncode
>>> p.poll()
0
>>> p.returncode
0
Code: Alles auswählen
>>> p = subprocess.Popen("echo $HOME", shell=True)
/home/rbreu
>>> p.returncode
>>> p.returncode
>>> p.returncode
>>> p.returncode
>>> p.returncode
>>> p.returncode
>>> p.poll()
0
>>> p.returncode
0
Code: Alles auswählen
process = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print process.pid
Code: Alles auswählen
process = subprocess.Popen(cmd, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print process.pid
Uff, sorry, hab das irgendwie auf "was ist der returncode" reduziert.BlackJack hat geschrieben:@keppla: `wait()` blockiert aber. Die Aufgabenstellung war ja nach x Sekunden nachsehen ob Prozess fertig, wenn nein -> töten.
Weil es geht... nein ernsthaft: ich bastle eine einfache Python-Shell, um auf einen entfernten Rechner zugreifen zu können.Rebecca hat geschrieben:Warum moechtest du ueberhaupt aus Python heraus Shell-Anweisungen ausfuehren?
Ich hab sowas mal gemacht, siehe:droptix hat geschrieben:Ich möchte einen Timeout festlegen, um den Sub-Prozess ggf. automatisch zu beenden, wenn er z.B. nach 15 Sekunden nicht "antwortet".
Danke, aber dient mir leider überhaupt nicht. Ich will ja nicht abwarten, bis der Prozess tatsächlich gekillt wurde und hinterher darauf reagieren. Außerdem ist es komisch zu sagen "Wenn der Prozess 30 Sekunden dauerte und dann mit returncode 0 (= i.d.R. sauberer Exit ohne Fehler) endete, dann wurde er wahrscheinlich gekillt." -> stimmt ja höchst wahrscheinlich nicht und ist total vom Prozess abhängig.jens hat geschrieben:Ich hab sowas mal gemacht
Das Problem habe ich auch. Ich umgehe das einfach damit, dass ich .read() erst durchführe, wenn .returncode nicht gleich None ist (andernfalls greift sowieso der Timeout und killt den Prozess). Ich weiß aber nicht, wie viel Output dabei gepuffert wird.jens hat geschrieben:Wurde der Process abgeschossen, blockiert das .read()...
Code: Alles auswählen
TIMEOUT = 3
PLATFORM = sys.platform
if PLATFORM == "win32":
import win32api
import win32con
import win32process
else:
import os
import signal
# ... somewhere else:
process = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
t = time.time()
while True:
process.poll()
if process.returncode is not None:
output = process.stdout.read()
returnCode = process.returncode
break
elif time.time() - t >= TIMEOUT:
# try to kill process
try:
if PLATFORM == "win32":
try:
h = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, process.pid)
handle = h.handle
win32process.TerminateProcess(handle, 1)
killed = process.pid
except Exception, e:
killed = e
else:
try:
os.kill(process.pid, signal.SIGUSR1)
killed = process.pid
except Exception, e:
killed = e
finally:
break
time.sleep(0.5)
Es gibt ja viele verschiedene Signale. SIGTERM (15) ist quasi die freundliche Bitte an den Prozess, sich ordnungsgemaess zu beenden. Der Prozess kann dann noch aufraeumen, koennte das Signal sogar ignorieren. IMO wird z.B. ein SIGTERM gesendet, wenn du im Fenster-Titel auf das "x" clickst.jens hat geschrieben:Warum, kannst du das näher erläutern? Ich kenne mich da nicht so richtig aus...lunar hat geschrieben:SIGTERM nutzen.