Subscribed unsubscribe Subscribe Subscribe

[Python][Windows][subprocess] subprocess モジュールの隠し関数?

os.spawnv() が思ったように動いてくれないのでドキュメントやら CRT のソースやらを追っていたら、Windows 版の Python ではビルトインの _subprocess モジュールに次のドキュメント化されていない関数と定数が定義されていることに気づいた (Python 2.5.1 で確認)。これらはユーザランド実装である subprocess.Popen クラスで使われている。

で、これの何がうれしいかというと TerminateProcess() を使うのに Python for Windows Extensions (win32api) をわざわざ入れなくてもよいところ。

  • 関数
    • GetStdHandle(hdl_type) -> hConsole
    • GetCurrentProcess() -> hProcess
    • DuplicateHandle(hSrcProc, hSrc, hTargetProc, dwDesiredAcc, bInherit, dwOpts) -> handle
    • CreatePipe(dwPipeAttrs, dwBufSize) -> (hReadPipe, hWritePipe)
    • CreateProcess(szAppName, szCmdLine, dwProcAttrs, dwThrAttrs, bInherit, dwFlags, dictEnv, szCurDir, dictStartupInfo) -> (hProc, hThread, dwProcId, dwThrId)
    • TerminateProcess(hProc, dwExitCode)
    • GetExitCodeProcess(hProc) -> exit code
    • WaitForSingleObject(hdl, dwTime) -> status
    • GetVersion() -> version
    • GetModuleFileName(hMod) -> module file name
  • 定数
    • STD_INPUT_HANDLE
    • STD_OUTPUT_HANDLE
    • STD_ERROR_HANDLE
    • DUPLICATE_SAME_ACCESS
    • STARTF_USESTDHANDLES
    • STARTF_USESHOWWINDOW
    • SW_HIDE
    • INFINITE
    • WAIT_OBJECT_0
    • CREATE_NEW_CONSOLE

CreateProcess の dictStartupInfo には以下のキーを持つディクショナリを指定する。

dwFlags STARTUP_INFO のフラグ
wShowWindow WIN32 API 関数の ShowWindow() に渡すフラグ。STARTF_USESHOWWINDOW を指定したときのみ有効
hStdInput 標準入力を表すハンドル。dwFlags に STARTF_USESTDHANDLES を指定したときのみ有効
hStdOutput 標準入力を表すハンドル。dwFlags に STARTF_USESTDHANDLES を指定したときのみ有効
hStdError 標準入力を表すハンドル。dwFlags に STARTF_USESTDHANDLES を指定したときのみ有効