|
@@ -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
|
|
|
|
- compat_subprocess_get_DEVNULL = lambda: DEVNULL
|
|
|
|
-except ImportError:
|
|
|
|
|
|
+ _DEVNULL = subprocess.DEVNULL
|
|
|
|
+ compat_subprocess_get_DEVNULL = lambda: _DEVNULL
|
|
|
|
+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',
|