2016-04-21 8 views
0

Ich habe eine Batch-Skript ('a.bat'), die den Ordner zippen, wie folgt:Wie schließe ich die Python-Script-Konsole, wenn der Aufruf des Batch-Skripts abgeschlossen ist?

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

nun die a.bat aus dem Python-Skript, ich rufe Sie wie folgt vor:

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

Also, was passiert ist, ich bekomme sample.zip Ordner, aber seine 0KB Größe und wenn ich schließe das Konsolenfenster des Skripts zeigt es die komplette KB's drin.

Also, meine Frage ist, was soll ich hinzufügen, mein Python-Skript, das den Ordner richtig gezippt wird und die Konsole auch selbst geschlossen werden.

+2

Ich denke, [die Dokumentation] (https://docs.python.org/3/library/subprocess.html#popen-objects) beantwortet Ihre Frage: _“ ['wait'] wird bei der Verwendung von' stdout = PIPE' oder 'stderr = PIPE' festgefahren, und der untergeordnete Prozess erzeugt genug Output für eine Pipe, so dass er blockiert, wenn er darauf wartet, dass der OS-Pipe-Puffer mehr Daten akzeptiert() 'bei der Verwendung von Rohren, um das zu vermeiden._" Korrigiere mich, wenn ich falsch liege. – ChrisP

+0

Wie @ChrisP sagte - der Prozess wartet wahrscheinlich darauf, dass Sie die PIPEs lesen, warum geben Sie Pipes an, wenn Sie sie nicht verwenden? Die ZIP-Datei hat die Größe 0, da die Puffer nicht bis zum Ende des Programms geleert werden. – cdarke

+0

Wenn Ihnen die Ausgabe nicht wichtig ist, senden Sie sie an das 'nul'-Gerät, z. 'nul = os.open ('//./ nul', os.O_RDWR);' 'rc = unterprocess.call ('D: /A.bat', stdin = nul, stdout = nul, stderr = nul) ' . Sie können 'os.devnull' anstelle von' '//./ nul'' verwenden, um es plattformübergreifend zu machen, aber da Sie eine Batch-Datei verwenden, bezweifle ich, dass das wichtig ist. – eryksun

Antwort

0

Werfen Sie einen Blick auf Popen.poll()https://docs.python.org/3/library/subprocess.html

u überprüfen kann, ob es noch wie diese

while p.poll() is None: 
    print("Working...") 
    #... 

funktioniert aber wahrscheinlich sogar Popen.poll() weil stucked wird von Rohren.

Verwenden Sie die p.communicate dann

Verwandte Themen