web-dev-qa-db-ja.com

Python Windowsサービスとして実行中:OSError:[WinError 6]ハンドルが無効です

Windowsサービスとして実行されているPythonスクリプトがあります。このスクリプトは、次のようにして別のプロセスをフォークします。

with subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as proc:

これにより、次のエラーが発生します。

OSError: [WinError 6] The handle is invalid
   File "C:\Program Files (x86)\Python35-32\lib\subprocess.py", line 911, in __init__
   File "C:\Program Files (x86)\Python35-32\lib\subprocess.py", line 1117, in _get_handles
13

subprocess.pyの1117行目は次のとおりです。

p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)

サービスプロセスにはSTDINが関連付けられていない(TBC)

この問題のあるコードは、popenのstdin引数としてファイルまたはnullデバイスを指定することで回避できます。

Python 3.xでは、単にstdin=subprocess.DEVNULLを渡すことができます。例えば。

subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL)

Python 2.xでは、ファイルハンドラをnullにしてから、それをpopenに渡す必要があります。

devnull = open(os.devnull, 'wb')
subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=devnull)
21

追加 stdin=subprocess.PIPE お気に入り:

with subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT) as proc:
1
zelusp