bpo-26128: Added __init__to subprocess.STARTUPINFO (#171)

The Windows-specific subprocess.STARTUPINFO class now accepts
keyword-only arguments to its constructor to set the various
data attributes.

Patch by Subhendu Ghosh.
diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst
index ea065b8..e9ba15e 100644
--- a/Doc/library/subprocess.rst
+++ b/Doc/library/subprocess.rst
@@ -746,7 +746,8 @@
 
    Partial support of the Windows
    `STARTUPINFO <https://msdn.microsoft.com/en-us/library/ms686331(v=vs.85).aspx>`__
-   structure is used for :class:`Popen` creation.
+   structure is used for :class:`Popen` creation. The following attributes can be set
+   by passing them as keyword-only arguments.
 
    .. attribute:: dwFlags
 
@@ -788,6 +789,8 @@
       :data:`SW_HIDE` is provided for this attribute. It is used when
       :class:`Popen` is called with ``shell=True``.
 
+   .. versionchanged:: 3.7
+      *Keyword-only argument* support was added.
 
 Constants
 ^^^^^^^^^
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index 67b9c9f..dffcda3 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -127,11 +127,13 @@
     import msvcrt
     import _winapi
     class STARTUPINFO:
-        dwFlags = 0
-        hStdInput = None
-        hStdOutput = None
-        hStdError = None
-        wShowWindow = 0
+        def __init__(self, *, dwFlags=0, hStdInput=None, hStdOutput=None,
+                     hStdError=None, wShowWindow=0):
+            self.dwFlags = dwFlags
+            self.hStdInput = hStdInput
+            self.hStdOutput = hStdOutput
+            self.hStdError = hStdError
+            self.wShowWindow = wShowWindow
 else:
     import _posixsubprocess
     import select
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 82e0b87..812e7bf 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -2550,6 +2550,22 @@
         subprocess.call([sys.executable, "-c", "import sys; sys.exit(0)"],
                         startupinfo=startupinfo)
 
+    def test_startupinfo_keywords(self):
+        # startupinfo argument
+        # We use hardcoded constants, because we do not want to
+        # depend on win32all.
+        STARTF_USERSHOWWINDOW = 1
+        SW_MAXIMIZE = 3
+        startupinfo = subprocess.STARTUPINFO(
+            dwFlags=STARTF_USERSHOWWINDOW,
+            wShowWindow=SW_MAXIMIZE
+        )
+        # Since Python is a console process, it won't be affected
+        # by wShowWindow, but the argument should be silently
+        # ignored
+        subprocess.call([sys.executable, "-c", "import sys; sys.exit(0)"],
+                        startupinfo=startupinfo)
+
     def test_creationflags(self):
         # creationflags argument
         CREATE_NEW_CONSOLE = 16
diff --git a/Misc/ACKS b/Misc/ACKS
index 255318e..1995adb 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
Binary files differ
diff --git a/Misc/NEWS b/Misc/NEWS
index 74ec8c3..4413c51 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,7 +13,7 @@
 - bpo-28598: Support __rmod__ for subclasses of str being called before
   str.__mod__.  Patch by Martijn Pieters.
 
-- bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX. 
+- bpo-29607: Fix stack_effect computation for CALL_FUNCTION_EX.
   Patch by Matthieu Dartiailh.
 
 - bpo-29602: Fix incorrect handling of signed zeros in complex constructor for
@@ -1243,6 +1243,9 @@
 Library
 -------
 
+- Issue #26128: Added keyword-only arguments support for
+  subprocess.STARTUPINFO
+
 - Issue #27517: LZMA compressor and decompressor no longer raise exceptions if
   given empty data twice.  Patch by Benjamin Fogle.