以下のようなステートメントをいくつか書きました。
os.system(cmd) #do something
subprocess.call('taskkill /F /IM exename.exe')
両方ともコンソールをポップアップします。
コンソールがポップアップしないようにするにはどうすればよいですか?
プロセス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
などの開いているディスクファイルまたはパイプに設定できます。
Shell=True
引数をサブプロセスの呼び出しに追加します。
subprocess.call('taskkill /F /IM exename.exe', Shell=True)
または、待つ必要がない場合は、subprocess.Popen
ではなくsubprocess.call
を使用します。
subprocess.Popen('taskkill /F /IM exename.exe', Shell=True)