2017-02-22 3 views
0

Ich versuche, einfaches Skript in Windows in der gleichen Shell auszuführen. Wenn ich laufesubprocess.Popen funktioniert nicht mit shell = False

subprocess.call(["python.exe", "a.py"], shell=False) 

Es funktioniert gut.

Aber wenn ich

subprocess.Popen(["python.exe", "a.py"], shell=False) 

laufen öffnet es neue Shell und die Shell = false hat keine Auswirkung.

a.py nur Nachricht auf den Bildschirm drucken.

+0

Mögliche Duplikat zu verwenden wäre [Python: subprocess Aufruf mit Shell = False funktioniert nicht] (http://stackoverflow.com/questions/25465700/python-subprocess-call- with-shell-false-not-working) –

Antwort

0

Der erste Aufruf Popen mit shell=False bedeutet nicht, dass der zugrunde liegende Python nicht versucht, ein Fenster/eine Konsole zu öffnen. Es ist nur so, dass die aktuelle Python-Instanz python.exe direkt und nicht in einer System-Shell (cmd oder sh) ausführt.

Zweitens, Popen gibt ein Handle auf den Prozess zurück, und Sie müssen eine wait() auf diesem Handle durchführen, damit es ordnungsgemäß beendet wird, oder Sie könnten einen nicht mehr existierenden Prozess generieren (abhängig von der Plattform, auf der Sie ausgeführt werden). Ich schlage vor, dass Sie versuchen

p = subprocess.Popen(["python.exe", "a.py"], shell=False) 
return_code = p.wait() 

auf Prozess Beendigung warten und Rückgabecode erhalten.

Beachten Sie, dass Popen eine sehr schlechte Möglichkeit ist, Prozesse im Hintergrund auszuführen. Der beste Weg, einen separaten Thread

import subprocess 
import threading 

def run_it(): 
    subprocess.call(["python.exe", "a.py"], shell=False) 

t = threading.Thread(target=run_it) 
t.start() 
# do your stuff 

# in the end 
t.join() 
+0

Aber ich möchte nicht warten, bis der Prozess beendet wird ... das ist der Grund, warum ich Popen benutze und nicht anrufe. – Hila

+0

ok, dann sehe meine Bearbeitung. Benutze 'Popen' überhaupt nicht. –

+0

Danke, das Problem ist, dass es immer noch wartet, bis der Thread fertig ist ... Ich möchte, dass mein Code ausgeführt wird, einen anderen Prozess ausführen und beenden. Ich möchte nicht warten, bis der Prozess beendet ist. – Hila

Verwandte Themen