Python 防止关闭通过子进程打开的DOS外壳窗口

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

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

我使用
子流程
运行具有正确参数的7-Zip可执行文件。
子进程
打开带有
7z.exe
输出的DOS shell;这很好,因为有一个文件压缩的百分比指标,有时这个过程可能会很长。我的问题是,用户将能够自愿或意外地通过以下方式中断压缩任务:

  • 单击DOS窗口的关闭按钮,或
  • 按Ctrl-C
  • 是否可以禁用从
    子进程打开的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。

    不幸的是,这在我的情况下不起作用,因为据我所知,我找到的所有读取标准的函数都不会等到子进程结束。这意味着所有应用程序都将冻结,直到子流程结束,只有当它结束时,我才能一起打印所有输出。