1

7-Zip などでファイルのリストを圧縮するプログラム (Windows で使用されます) を作成しようとしています。

subprocessは正しい引数で 7-Zip 実行可能ファイルを実行していました。 出力subprocessで DOS シェルを開きます。7z.exeファイル圧縮のパーセンテージ指標があり、プロセスが非常に長くなる場合があるため、これは良いことです. 私の問題は、ユーザーが自発的または偶然に、次のいずれかの方法で圧縮タスクを中断できることです。

  1. DOS ウィンドウの閉じるボタンをクリックする、または
  2. Ctrl-を押しCます。

から開いた DOS シェルへのあらゆる種類の入力を無効にすることはできsubprocessますか? あるいは、実行時に DOS シェルの出力を自分のプログラムに渡すにはどうすればよいですか? process.stdout.read(1024)とを試しましprocess.communicate()たが、サブプロセスが終了したときに両方とも出力を読み取りました。実行中ではありません。

すべての 7-Zip タスクを同時に実行できるようにsubprocess.Popen()代わりに使用しましたが、問題の解決に役立つ場合は変更できます。subprocess.call()

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
        )
4

1 に答える 1

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)

STARTUPINFOWindows専用であることを忘れないでください。

于 2012-10-31T09:58:50.093 に答える