【问题标题】:prevent closing of DOS shell window opened via subprocess防止关闭通过子进程打开的 DOS shell 窗口
【发布时间】:2012-10-31 09:36:52
【问题描述】:

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

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

  1. 单击 DOS 窗口的关闭按钮,或
  2. Ctrl-C

是否可以禁用从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
        )

【问题讨论】:

    标签: python python-2.7 subprocess


    【解决方案1】:

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

    【讨论】:

    • 不幸的是,这在我的情况下不起作用,因为据我所知,我发现读取标准输出的所有函数都等到子进程结束。这意味着所有应用程序都会冻结,直到子进程结束,并且只有在它结束时我才能打印所有输出。
    猜你喜欢
    • 2015-06-12
    • 2019-10-06
    • 2012-07-17
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    相关资源
    最近更新 更多