2016-05-11 10 views
1

Ich habe eine Batch-Datei, die einen Ordner zippen wie folgt (zip.bat):Wie warten, bis die Batch-Datei beendet wird, wenn sie von Python aufgerufen wird?

for /d %%X in (D:/sample/target/bin) do "c:\Program Files\7-Zip\7z.exe" a -mx "%%X.zip" "%%X\*" 

Die Batch-Datei-Ordner ist zip wird und funktioniert einwandfrei. Jetzt ist Aufruf diese Partie aus einem Python-Skript wie folgt:

import subprocess as sp 
import sys 
start_zip_batch = sp.Popen(['D:/zip.bat'],stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE, shell = True) 
start_zip_batch.wait() 

So, jetzt, wenn das Skript gemacht wird ausführen die bin.zip Ordner erstellt, aber halten 0 Bytes im Innern zeigte und nach einer Weile nicht mehr reagiert und ich muss es manuell schließen. Der Behälterordner ist ungefähr 403 MB. Also, bitte schlage vor, wie soll ich zip.bat von Python so nennen, dass es den Zip-Ordner erstellt und dann ordentlich geschlossen wird.

+0

Verwenden 'start_zip_batch.communicate ('), um die' 'stdout' und stderr' Rohre von auffüllt und Blockieren zu verhindern. Aber warum setzen Sie die Ein- und Ausgabe auf Pipes? Wenn Sie keine Standardeingabe und -ausgabe benötigen, können Sie die Standardstreams in Python 3 auf 'subprocess.DEVNULL' oder in Python 2 auf' fnull = öffnen (os.devnull, 'r +') 'setzen. – eryksun

Antwort

0

Es gibt mehrere Subprozessmethoden, die auf den Abschluss warten.

check_call ist nützlich, wenn Sie Bereinigung oder Berichterstattung auf der Grundlage des Befehls Rückkehrcode durchführen möchten.

subprocess.check_call (args, *, stdin = None, stdout = None, Stderr = None, shell = False)

Run-Befehl mit Argumenten. Warten Sie, bis der Befehl abgeschlossen ist. Wenn der Rückkehrcode Null war, dann gebe zurück, sonst calledProcessError. Das CalledProcessError-Objekt hat den Rückkehrcode im Returncode-Attribut.

The Docs

Verwandte Themen