82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
![]() |
import sys, subprocess
|
||
|
|
||
|
# Basic attributes and exceptions
|
||
|
PIPE = subprocess.PIPE
|
||
|
STDOUT = subprocess.STDOUT
|
||
|
DEVNULL = subprocess.DEVNULL
|
||
|
SubprocessError = subprocess.SubprocessError
|
||
|
TimeoutExpired = subprocess.TimeoutExpired
|
||
|
CalledProcessError = subprocess.CalledProcessError
|
||
|
|
||
|
# Windows-only attributes and functions
|
||
|
if sys.platform == 'win32':
|
||
|
import msvcrt
|
||
|
import _winapi
|
||
|
|
||
|
# creationflags
|
||
|
CREATE_NEW_CONSOLE = subprocess.CREATE_NEW_CONSOLE
|
||
|
CREATE_NEW_PROCESS_GROUP = subprocess.CREATE_NEW_PROCESS_GROUP
|
||
|
|
||
|
# startupinfo
|
||
|
STARTUPINFO = subprocess.STARTUPINFO
|
||
|
STARTF_USESTDHANDLES = subprocess.STARTF_USESTDHANDLES
|
||
|
STARTF_USESHOWWINDOW = subprocess.STARTF_USESHOWWINDOW
|
||
|
SW_HIDE = subprocess.SW_HIDE
|
||
|
|
||
|
# file handles
|
||
|
Handle = subprocess.Handle
|
||
|
STD_INPUT_HANDLE = subprocess.STD_INPUT_HANDLE
|
||
|
STD_OUTPUT_HANDLE = subprocess.STD_OUTPUT_HANDLE
|
||
|
STD_ERROR_HANDLE = subprocess.STD_ERROR_HANDLE
|
||
|
|
||
|
def make_inheritable_handle(fd):
|
||
|
"""Create inheritable duplicate of handle from file descriptor"""
|
||
|
h = _winapi.DuplicateHandle(
|
||
|
_winapi.GetCurrentProcess(),
|
||
|
msvcrt.get_osfhandle(fd),
|
||
|
_winapi.GetCurrentProcess(), 0, 1,
|
||
|
_winapi.DUPLICATE_SAME_ACCESS
|
||
|
)
|
||
|
return subprocess.Handle(h)
|
||
|
|
||
|
|
||
|
def hide_console_window(startupinfo=None):
|
||
|
"""Returns altered startupinfo to hide console window on Windows"""
|
||
|
if sys.platform != 'win32':
|
||
|
return None
|
||
|
|
||
|
if not startupinfo:
|
||
|
startupinfo = subprocess.STARTUPINFO()
|
||
|
|
||
|
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
|
||
|
return startupinfo
|
||
|
|
||
|
|
||
|
class Popen(subprocess.Popen):
|
||
|
"""subprocess.Popen with ability to hide console window on Windows"""
|
||
|
def __init__(self, *pargs, console=True, **kwargs):
|
||
|
if not console:
|
||
|
kwargs['startupinfo'] = hide_console_window(kwargs.get('startupinfo'))
|
||
|
super().__init__(*pargs, **kwargs)
|
||
|
|
||
|
|
||
|
def call(*pargs, console=True, **kwargs):
|
||
|
"""subprocess.call with ability to hide console window on Windows"""
|
||
|
if not console:
|
||
|
kwargs['startupinfo'] = hide_console_window(kwargs.get('startupinfo'))
|
||
|
return subprocess.call(*pargs, **kwargs)
|
||
|
|
||
|
|
||
|
def check_call(*pargs, console=True, **kwargs):
|
||
|
"""subprocess.check_call with ability to hide console window on Windows"""
|
||
|
if not console:
|
||
|
kwargs['startupinfo'] = hide_console_window(kwargs.get('startupinfo'))
|
||
|
return subprocess.check_call(*pargs, **kwargs)
|
||
|
|
||
|
|
||
|
def check_output(*pargs, console=True, **kwargs):
|
||
|
"""subprocess.check_output with ability to hide console window on Windows"""
|
||
|
if not console:
|
||
|
kwargs['startupinfo'] = hide_console_window(kwargs.get('startupinfo'))
|
||
|
return subprocess.check_output(*pargs, **kwargs)
|