|
|
@ -2438,9 +2438,9 @@ compat_html_parser_HTMLParser = compat_HTMLParser
|
|
|
|
compat_html_parser_HTMLParseError = compat_HTMLParseError
|
|
|
|
compat_html_parser_HTMLParseError = compat_HTMLParseError
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
from subprocess import DEVNULL
|
|
|
|
_DEVNULL = subprocess.DEVNULL
|
|
|
|
compat_subprocess_get_DEVNULL = lambda: DEVNULL
|
|
|
|
compat_subprocess_get_DEVNULL = lambda: _DEVNULL
|
|
|
|
except ImportError:
|
|
|
|
except AttributeError:
|
|
|
|
compat_subprocess_get_DEVNULL = lambda: open(os.path.devnull, 'w')
|
|
|
|
compat_subprocess_get_DEVNULL = lambda: open(os.path.devnull, 'w')
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
try:
|
|
|
@ -2958,6 +2958,33 @@ except ImportError:
|
|
|
|
return exc_val is not None and isinstance(exc_val, self._exceptions or tuple())
|
|
|
|
return exc_val is not None and isinstance(exc_val, self._exceptions or tuple())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# subprocess.Popen context manager
|
|
|
|
|
|
|
|
# avoids leaking handles if .communicate() is not called
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
_Popen = subprocess.Popen
|
|
|
|
|
|
|
|
# check for required context manager attributes
|
|
|
|
|
|
|
|
_Popen.__enter__ and _Popen.__exit__
|
|
|
|
|
|
|
|
compat_subprocess_Popen = _Popen
|
|
|
|
|
|
|
|
except AttributeError:
|
|
|
|
|
|
|
|
# not a context manager - make one
|
|
|
|
|
|
|
|
from contextlib import contextmanager
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@contextmanager
|
|
|
|
|
|
|
|
def compat_subprocess_Popen(*args, **kwargs):
|
|
|
|
|
|
|
|
popen = None
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
popen = _Popen(*args, **kwargs)
|
|
|
|
|
|
|
|
yield popen
|
|
|
|
|
|
|
|
finally:
|
|
|
|
|
|
|
|
if popen:
|
|
|
|
|
|
|
|
for f in (popen.stdin, popen.stdout, popen.stderr):
|
|
|
|
|
|
|
|
if f:
|
|
|
|
|
|
|
|
# repeated .close() is OK, but just in case
|
|
|
|
|
|
|
|
with compat_contextlib_suppress(EnvironmentError):
|
|
|
|
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
popen.wait()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Fix https://github.com/ytdl-org/youtube-dl/issues/4223
|
|
|
|
# Fix https://github.com/ytdl-org/youtube-dl/issues/4223
|
|
|
|
# See http://bugs.python.org/issue9161 for what is broken
|
|
|
|
# See http://bugs.python.org/issue9161 for what is broken
|
|
|
|
def workaround_optparse_bug9161():
|
|
|
|
def workaround_optparse_bug9161():
|
|
|
@ -3314,6 +3341,7 @@ __all__ = [
|
|
|
|
'compat_struct_pack',
|
|
|
|
'compat_struct_pack',
|
|
|
|
'compat_struct_unpack',
|
|
|
|
'compat_struct_unpack',
|
|
|
|
'compat_subprocess_get_DEVNULL',
|
|
|
|
'compat_subprocess_get_DEVNULL',
|
|
|
|
|
|
|
|
'compat_subprocess_Popen',
|
|
|
|
'compat_tokenize_tokenize',
|
|
|
|
'compat_tokenize_tokenize',
|
|
|
|
'compat_urllib_error',
|
|
|
|
'compat_urllib_error',
|
|
|
|
'compat_urllib_parse',
|
|
|
|
'compat_urllib_parse',
|
|
|
|