Python subprocess.call wartet nicht auf den Prozess, um den Mixer zu beenden

8

Ich habe ein Python-Skript in Blender, wo es

hat

subprocess.call(os.path.abspath('D:/Test/run-my-script.sh'),shell=True)

gefolgt von vielen anderen Codes, die von diesem Shell-Skript abhängen, um zu beenden. Was passiert ist, dass es nicht auf das Ende wartet, ich weiß nicht warum? Ich habe sogar versucht, Popen anstelle von call zu verwenden, wie gezeigt:

%Vor%

und ich habe versucht, die Kommunikation zu verwenden, aber es hat immer noch nicht funktioniert:

%Vor%

Dieses Shell-Skript funktioniert großartig auf MacOS (nach dem Ändern von Pfaden) und wartet, wenn subprocess.call(['sh', '/userA/Test/run-my-script.sh'])

verwendet wird

aber auf Windows ist das, was passiert, ich führe das unten stehende Python-Skript in Blender aus, sobald es in die Unterprozess-Zeile Git bash kommt und das Shell-Skript ausführt, während Blender nicht darauf wartet, dass es fertig ist, druckt es Hello in seiner Konsole, ohne darauf zu warten, dass die Git Bash beendet wird. Irgendwelche Hilfe?

%Vor%     
Tak 11.04.2017, 23:52
quelle

6 Antworten

4

Sie können subprocess.call verwenden, um genau das zu tun.

  

Unterprozess. Aufruf ( Argumente, *, stdin = Keine, stdout = Keine, stderr = Keine, Shell = False, timeout = Keine )

     

Führen Sie den von args beschriebenen Befehl aus. Warten Sie, bis der Befehl abgeschlossen ist, und geben Sie das Rückgabecodeattribut zurück.

Bearbeiten : Ich glaube, ich habe eine Ahnung davon, was vor sich geht. Der Befehl funktioniert auf Ihrem Mac, weil Macs, glaube ich, Bash out of the box unterstützen ( zumindest etwas funktionell Entsprechendes ), während es unter Windows Ihren Versuch sieht, eine ".sh" -Datei auszuführen und stattdessen feuert up Git Bash was ich vermute, führt ein paar Gabeln beim Start.

Da Python denkt , dass Ihr Skript fertig ist, ist die PID weg.

Wenn ich du wäre, würde ich das tun:

  • Erzeugen Sie einen einzigartigen, nicht existierenden, absoluten Pfad in Ihrem "Start" -Skript mit Hilfe der tempfile Modul.
  • Übergeben Sie beim Starten des Skripts den gerade erstellten Pfad als Argument.
  • Lassen Sie beim Starten des Skripts eine Datei im Pfad erstellen. Wenn Sie fertig sind, löschen Sie die Datei.
  • Das Startscript sollte auf das Erstellen und Löschen dieser Datei achten, um den Status des Skripts anzuzeigen.

Hoffentlich macht das Sinn.

    
joeb 08.06.2017 02:12
quelle
4

Sie können die Popen.communicate API verwenden.

%Vor%

Der Befehl

%Vor%

Interaktion mit Prozess: Senden von Daten an stdin. Lies Daten von stdout und stderr, bis das Dateiende erreicht ist. Warten Sie, bis der Prozess beendet ist.

    
Pankaj 14.06.2017 05:59
quelle
3

subprocess.run wird standardmäßig auf den Abschluss des Prozesses warten.

    
Grr 11.04.2017 23:56
quelle
2

Sie können os.system wie folgt verwenden:

%Vor%     
A STEFANI 09.06.2017 16:14
quelle
2

Verwenden Sie subprocess.Popen und Popen.wait :

%Vor%

Sie können stattdessen auch check_call () verwenden von Popen.

    
Francisco Raga 12.06.2017 06:55
quelle
0

Es gibt offensichtlich Fälle, in denen der Befehl run fehlschlägt. Dies ist meine Problemumgehung:

%Vor%     
SeF 14.06.2017 21:08
quelle