当从python调用时,如何等待批处理文件结束?

1 人关注

我有一个批处理文件,正在压缩一个文件夹,如下所示(zip.bat)。

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

该批处理文件将压缩文件夹bin,并且工作正常。现在我从一个Python脚本中调用这个批处理,如下所示。

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

所以,现在当脚本执行时,它创建了bin.zip文件夹,但里面一直显示为0字节,一段时间后,它停止响应,我需要手动关闭它。bin文件夹大约有403 mb。所以,请建议我如何从python中调用zip.bat,使其创建zip文件夹,然后整齐地关闭。

1 个评论
使用 start_zip_batch.communicate() 来防止 stdout stderr 的管道被填满和堵塞。但你为什么要把输入和输出设置为管道?如果你不需要标准输入和输出,你可以在 Python 3 中把标准流设置为 subprocess.DEVNULL ,或者在 Python 2 中设置为 fnull = open(os.devnull, 'r+')
python
windows
batch-file
Learner
Learner
发布于 2016-05-11
3 个回答
Jason Lee Eaton
Jason Lee Eaton
发布于 2021-02-17
0 人赞同

有几个子进程方法在等待完成。

如果你想根据命令的返回代码进行清理或报告, check_call 很有用。

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

运行带有参数的命令。等待命令完成。如果返回代码为0,则返回,否则引发CalledProcessError。 CalledProcessError对象的返回代码将出现在 returncode属性中。

The Docs

Landyn J
Landyn J
发布于 2021-02-17
0 人赞同
print('filename')

如果你在.bat文件中没有任何输出,就可以工作。

mhawke
mhawke
发布于 2021-02-17
0 人赞同

最简单和最现代的方法是使用 subprocess.run() 执行该进程并等待其完成。

import subprocess
p = subprocess.run(['D:/zip.bat'])

这将执行该进程并返回一个CompletedProcess对象,你可以检查其returncode属性以确定该状态。

进程的stdout和stderr目的地不变,例如,如果命令是从终端运行的,输出仍然会出现在终端。