web-dev-qa-db-ja.com

os.system()またはsubprocess.call()を使用するときにコンソールを非表示にするにはどうすればよいですか?

以下のようなステートメントをいくつか書きました。

os.system(cmd) #do something
subprocess.call('taskkill /F /IM exename.exe')

両方ともコンソールをポップアップします。

コンソールがポップアップしないようにするにはどうすればよいですか?

54
Synapse

プロセスSTARTUPINFOはコンソールウィンドウを隠すことができます:

si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
#si.wShowWindow = subprocess.SW_HIDE # default
subprocess.call('taskkill /F /IM exename.exe', startupinfo=si)

または、作成フラグを設定して、ウィンドウの作成を無効にします。

CREATE_NO_WINDOW = 0x08000000
subprocess.call('taskkill /F /IM exename.exe', creationflags=CREATE_NO_WINDOW)

上記は、コンソールI/Oの有効なハンドルを備えたコンソールプロセスです(GetFileTypeによって返されるハンドルでGetStdHandleを呼び出すことによって検証されます)。ウィンドウがないだけで、親のコンソールがあれば継承しません。

子にコンソールをまったく持たないように強制することで、さらに一歩進めることができます。

DETACHED_PROCESS = 0x00000008
subprocess.call('taskkill /F /IM exename.exe', creationflags=DETACHED_PROCESS)

この場合、子の標準ハンドル(つまり、GetStdHandle)は0ですが、subprocess.DEVNULL(3.3)またはsubprocess.PIPEなどの開いているディスクファイルまたはパイプに設定できます。

91
Eryk Sun

Shell=True引数をサブプロセスの呼び出しに追加します。

subprocess.call('taskkill /F /IM exename.exe', Shell=True)

または、待つ必要がない場合は、subprocess.Popenではなくsubprocess.callを使用します。

subprocess.Popen('taskkill /F /IM exename.exe', Shell=True)
21
Chris Morgan