2016-04-21 4 views
0

У меня есть пакетный скрипт («A.bat»), который сжать папку, следующим образом:Как закрыть консоль скрипта python после завершения вызова пакетного скрипта?

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

Теперь я звоню A.bat из сценария питона следующим образом:

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() 

Итак, теперь я получаю папку sample.zip, но ее размер 0 КБ, и когда я закрываю консольное окно скрипта, он показывает полный КБ в нем.

Итак, мой вопрос заключается в том, что я должен добавить в свой скрипт python, который заставит папку правильно зашифровать, а консоль также будет закрыта сама по себе.

+2

Я думаю, [документация] (https://docs.python.org/3/library/subprocess.html#popen-objects) отвечает на ваш вопрос: _» ['wait'] будет блокироваться при использовании' stdout = PIPE' или 'stderr = PIPE', а дочерний процесс генерирует достаточный вывод в канал таким образом, что он блокирует ожидание того, что буфер буфера OS будет принимать больше данных. Используйте' Popen.communicate() 'при использовании труб, чтобы этого избежать.« Поправьте меня, если я ошибаюсь. – ChrisP

+0

Как сказал @ChrisP - процесс, вероятно, ждет вас, чтобы прочитать PIPE, почему вы указываете каналы, если вы их не используете? Zip-файл имеет нулевой размер, потому что буферы не сбрасываются до завершения программы. – cdarke

+0

Если вы не заботитесь о выходе, отправьте его на устройство 'nul', например. 'nul = os.open ('//./ nul', os.O_RDWR),' 'rc = subprocess.call ('D: /A.bat', stdin = nul, stdout = nul, stderr = nul)' , Вы можете использовать 'os.devnull' вместо' '//./ nul'', чтобы сделать его кросс-платформенным, но поскольку вы используете пакетный файл, я сомневаюсь, что это важно. – eryksun

ответ

0

Посмотрите Popen.poll()https://docs.python.org/3/library/subprocess.html

и можно проверить, если он до сих пор работает как этот

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

но, вероятно, даже Popen.poll() получает stucked, потому что труб.

Используйте p.communicate затем

Смежные вопросы