I have a Python script, which is running as a Windows Service. The script forks another process with:
with subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as proc:
which causes the following error:
OSError: [WinError 6] The handle is invalid File "C:Program Files (x86)Python35-32libsubprocess.py", line 911, in __init__ File "C:Program Files (x86)Python35-32libsubprocess.py", line 1117, in _get_handles
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Line 1117 in subprocess.py is:
p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)
which made me suspect that service processes do not have a STDIN associated with them (TBC)
This troublesome code can be avoided by supplying a file or null device as the stdin argument to popen.
In Python 3.x, you can simply pass stdin=subprocess.DEVNULL. E.g.
subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL)
In Python 2.x, you need to get a filehandler to null, then pass that to popen:
devnull = open(os.devnull, 'wb') subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=devnull)
Method 2
Add stdin=subprocess.PIPE like:
with subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT) as proc:
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0