2012-10-31 29 views
1

我试图创建一个程序(它将在Windows上使用)来压缩7-Zip和其他东西的文件列表。防止关闭通过子进程打开的DOS shell窗口

我使用subprocess以正确的参数运行7-Zip可执行文件。 subprocess7z.exe输出打开DOS shell;这很好,因为有一个百分比文件压缩指标,有时这个过程可能会很长。我的问题是,用户将能够-自愿或意外,中断在DOS窗口的关闭按钮压缩任务,或者通过

  1. 点击,或
  2. Ctrl键 - Ç

是否可以禁用从subprocess打开的任何类型的输入到DOS shell?另外,如何在运行时将DOS外壳的输出传递给我的程序?我尝试了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 
     ) 

回答

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。

+0

不幸的是,这在我的情况下不起作用,因为据我了解,我发现读取标准输出的所有函数都要等到子进程结束。这意味着所有的应用程序都会冻结,直到子进程结束,并且只有当它结束时,我才能打印所有输出到目标文件。 – BigDie

+0

你尝试过'sp.stdout.read(1)'? – lqs