Python 防止关闭通过子进程打开的DOS外壳窗口
我正在尝试创建一个程序(它将在Windows上使用)来压缩带有7-Zip和其他内容的文件列表 我使用Python 防止关闭通过子进程打开的DOS外壳窗口,python,python-2.7,subprocess,Python,Python 2.7,Subprocess,我正在尝试创建一个程序(它将在Windows上使用)来压缩带有7-Zip和其他内容的文件列表 我使用子流程运行具有正确参数的7-Zip可执行文件。 子进程打开带有7z.exe输出的DOS shell;这很好,因为有一个文件压缩的百分比指标,有时这个过程可能会很长。我的问题是,用户将能够自愿或意外地通过以下方式中断压缩任务: 单击DOS窗口的关闭按钮,或 按Ctrl-C 是否可以禁用从子进程打开的DOS外壳的任何类型的输入?或者,如何在运行时将DOS shell的输出传递给我的程序?我尝试了pro
子流程
运行具有正确参数的7-Zip可执行文件。
子进程
打开带有7z.exe
输出的DOS shell;这很好,因为有一个文件压缩的百分比指标,有时这个过程可能会很长。我的问题是,用户将能够自愿或意外地通过以下方式中断压缩任务:
子进程打开的DOS外壳的任何类型的输入?或者,如何在运行时将DOS shell的输出传递给我的程序?我尝试了process.stdout.read(1024)
和process.communicate()
,但都在子进程结束时读取输出;不是在它运行的时候
我使用了subprocess.Popen()
而不是subprocess.call()
,这样我可以同时运行所有7-Zip任务,但如果这有助于解决我的问题,我可以更改它
for f in self.fileList:
destination = self.newPath + "\\" + basename(f) + ".7z"
arglist = [self.sevZipPath, "a", "-mx9", destination, f]
sp = subprocess.Popen(
args = arglist,
cwd = self.newPath,
shell = False
)
您可以在startupinfo
中设置标志以隐藏窗口,并设置stdout=subprocess.PIPE
以捕获流程的输出
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags = subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
sp = subprocess.Popen(..., stdout=subprocess.PIPE, startupinfo=startupinfo)
请记住,STARTUPINFO
仅适用于Windows。不幸的是,这在我的情况下不起作用,因为据我所知,我找到的所有读取标准的函数都不会等到子进程结束。这意味着所有应用程序都将冻结,直到子流程结束,只有当它结束时,我才能一起打印所有输出。