防止关闭通过子进程打开的DOS shell窗口

时间:2012-10-31 09:36:53

标签: python python-2.7 subprocess

我正在尝试创建一个程序(它将在Windows上使用)来压缩带有7-Zip和其他内容的文件列表。

我使用subprocess使用正确的参数运行7-Zip可执行文件。 subprocess打开一个带有7z.exe输出的DOS shell;这很好,因为有一个文件压缩的​​百分比指示器,有时这个过程可能很长。我的问题是用户可以自愿或意外地通过

中断压缩任务
  1. 单击DOS窗口的关闭按钮,或
  2. Ctrl - C
  3. 是否可以禁用从subprocess打开的DOS shell的任何类型的输入?或者,如何在运行时将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
            )
    

1 个答案:

答案 0 :(得分:2)

您可以在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。