У меня есть пакетный скрипт («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, который заставит папку правильно зашифровать, а консоль также будет закрыта сама по себе.
Я думаю, [документация] (https://docs.python.org/3/library/subprocess.html#popen-objects) отвечает на ваш вопрос: _» ['wait'] будет блокироваться при использовании' stdout = PIPE' или 'stderr = PIPE', а дочерний процесс генерирует достаточный вывод в канал таким образом, что он блокирует ожидание того, что буфер буфера OS будет принимать больше данных. Используйте' Popen.communicate() 'при использовании труб, чтобы этого избежать.« Поправьте меня, если я ошибаюсь. – ChrisP
Как сказал @ChrisP - процесс, вероятно, ждет вас, чтобы прочитать PIPE, почему вы указываете каналы, если вы их не используете? Zip-файл имеет нулевой размер, потому что буферы не сбрасываются до завершения программы. – cdarke
Если вы не заботитесь о выходе, отправьте его на устройство 'nul', например. 'nul = os.open ('//./ nul', os.O_RDWR),' 'rc = subprocess.call ('D: /A.bat', stdin = nul, stdout = nul, stderr = nul)' , Вы можете использовать 'os.devnull' вместо' '//./ nul'', чтобы сделать его кросс-платформенным, но поскольку вы используете пакетный файл, я сомневаюсь, что это важно. – eryksun