41
41
then returns a (exitcode, output) tuple
42
42
"""
43
43
44
- import sys
45
- _mswindows = (sys .platform == "win32" )
46
-
44
+ import builtins
45
+ import errno
47
46
import io
48
47
import os
49
48
import time
50
49
import signal
51
- import builtins
50
+ import sys
51
+ import threading
52
52
import warnings
53
- import errno
54
53
from time import monotonic as _time
55
54
55
+
56
+ __all__ = ["Popen" , "PIPE" , "STDOUT" , "call" , "check_call" , "getstatusoutput" ,
57
+ "getoutput" , "check_output" , "run" , "CalledProcessError" , "DEVNULL" ,
58
+ "SubprocessError" , "TimeoutExpired" , "CompletedProcess" ]
59
+ # NOTE: We intentionally exclude list2cmdline as it is
60
+ # considered an internal implementation detail. issue10838.
61
+
62
+ try :
63
+ import msvcrt
64
+ import _winapi
65
+ _mswindows = True
66
+ except ModuleNotFoundError :
67
+ _mswindows = False
68
+ import _posixsubprocess
69
+ import select
70
+ import selectors
71
+ else :
72
+ from _winapi import (CREATE_NEW_CONSOLE , CREATE_NEW_PROCESS_GROUP ,
73
+ STD_INPUT_HANDLE , STD_OUTPUT_HANDLE ,
74
+ STD_ERROR_HANDLE , SW_HIDE ,
75
+ STARTF_USESTDHANDLES , STARTF_USESHOWWINDOW ,
76
+ ABOVE_NORMAL_PRIORITY_CLASS , BELOW_NORMAL_PRIORITY_CLASS ,
77
+ HIGH_PRIORITY_CLASS , IDLE_PRIORITY_CLASS ,
78
+ NORMAL_PRIORITY_CLASS , REALTIME_PRIORITY_CLASS ,
79
+ CREATE_NO_WINDOW , DETACHED_PROCESS ,
80
+ CREATE_DEFAULT_ERROR_MODE , CREATE_BREAKAWAY_FROM_JOB )
81
+
82
+ __all__ .extend (["CREATE_NEW_CONSOLE" , "CREATE_NEW_PROCESS_GROUP" ,
83
+ "STD_INPUT_HANDLE" , "STD_OUTPUT_HANDLE" ,
84
+ "STD_ERROR_HANDLE" , "SW_HIDE" ,
85
+ "STARTF_USESTDHANDLES" , "STARTF_USESHOWWINDOW" ,
86
+ "STARTUPINFO" ,
87
+ "ABOVE_NORMAL_PRIORITY_CLASS" , "BELOW_NORMAL_PRIORITY_CLASS" ,
88
+ "HIGH_PRIORITY_CLASS" , "IDLE_PRIORITY_CLASS" ,
89
+ "NORMAL_PRIORITY_CLASS" , "REALTIME_PRIORITY_CLASS" ,
90
+ "CREATE_NO_WINDOW" , "DETACHED_PROCESS" ,
91
+ "CREATE_DEFAULT_ERROR_MODE" , "CREATE_BREAKAWAY_FROM_JOB" ])
92
+
93
+
56
94
# Exception classes used by this module.
57
95
class SubprocessError (Exception ): pass
58
96
@@ -123,9 +161,6 @@ def stdout(self, value):
123
161
124
162
125
163
if _mswindows :
126
- import threading
127
- import msvcrt
128
- import _winapi
129
164
class STARTUPINFO :
130
165
def __init__ (self , * , dwFlags = 0 , hStdInput = None , hStdOutput = None ,
131
166
hStdError = None , wShowWindow = 0 , lpAttributeList = None ):
@@ -148,53 +183,6 @@ def copy(self):
148
183
wShowWindow = self .wShowWindow ,
149
184
lpAttributeList = attr_list )
150
185
151
- else :
152
- import _posixsubprocess
153
- import select
154
- import selectors
155
- import threading
156
-
157
- # When select or poll has indicated that the file is writable,
158
- # we can write up to _PIPE_BUF bytes without risk of blocking.
159
- # POSIX defines PIPE_BUF as >= 512.
160
- _PIPE_BUF = getattr (select , 'PIPE_BUF' , 512 )
161
-
162
- # poll/select have the advantage of not requiring any extra file
163
- # descriptor, contrarily to epoll/kqueue (also, they require a single
164
- # syscall).
165
- if hasattr (selectors , 'PollSelector' ):
166
- _PopenSelector = selectors .PollSelector
167
- else :
168
- _PopenSelector = selectors .SelectSelector
169
-
170
-
171
- __all__ = ["Popen" , "PIPE" , "STDOUT" , "call" , "check_call" , "getstatusoutput" ,
172
- "getoutput" , "check_output" , "run" , "CalledProcessError" , "DEVNULL" ,
173
- "SubprocessError" , "TimeoutExpired" , "CompletedProcess" ]
174
- # NOTE: We intentionally exclude list2cmdline as it is
175
- # considered an internal implementation detail. issue10838.
176
-
177
- if _mswindows :
178
- from _winapi import (CREATE_NEW_CONSOLE , CREATE_NEW_PROCESS_GROUP ,
179
- STD_INPUT_HANDLE , STD_OUTPUT_HANDLE ,
180
- STD_ERROR_HANDLE , SW_HIDE ,
181
- STARTF_USESTDHANDLES , STARTF_USESHOWWINDOW ,
182
- ABOVE_NORMAL_PRIORITY_CLASS , BELOW_NORMAL_PRIORITY_CLASS ,
183
- HIGH_PRIORITY_CLASS , IDLE_PRIORITY_CLASS ,
184
- NORMAL_PRIORITY_CLASS , REALTIME_PRIORITY_CLASS ,
185
- CREATE_NO_WINDOW , DETACHED_PROCESS ,
186
- CREATE_DEFAULT_ERROR_MODE , CREATE_BREAKAWAY_FROM_JOB )
187
-
188
- __all__ .extend (["CREATE_NEW_CONSOLE" , "CREATE_NEW_PROCESS_GROUP" ,
189
- "STD_INPUT_HANDLE" , "STD_OUTPUT_HANDLE" ,
190
- "STD_ERROR_HANDLE" , "SW_HIDE" ,
191
- "STARTF_USESTDHANDLES" , "STARTF_USESHOWWINDOW" ,
192
- "STARTUPINFO" ,
193
- "ABOVE_NORMAL_PRIORITY_CLASS" , "BELOW_NORMAL_PRIORITY_CLASS" ,
194
- "HIGH_PRIORITY_CLASS" , "IDLE_PRIORITY_CLASS" ,
195
- "NORMAL_PRIORITY_CLASS" , "REALTIME_PRIORITY_CLASS" ,
196
- "CREATE_NO_WINDOW" , "DETACHED_PROCESS" ,
197
- "CREATE_DEFAULT_ERROR_MODE" , "CREATE_BREAKAWAY_FROM_JOB" ])
198
186
199
187
class Handle (int ):
200
188
closed = False
@@ -215,6 +203,19 @@ def __repr__(self):
215
203
216
204
__del__ = Close
217
205
__str__ = __repr__
206
+ else :
207
+ # When select or poll has indicated that the file is writable,
208
+ # we can write up to _PIPE_BUF bytes without risk of blocking.
209
+ # POSIX defines PIPE_BUF as >= 512.
210
+ _PIPE_BUF = getattr (select , 'PIPE_BUF' , 512 )
211
+
212
+ # poll/select have the advantage of not requiring any extra file
213
+ # descriptor, contrarily to epoll/kqueue (also, they require a single
214
+ # syscall).
215
+ if hasattr (selectors , 'PollSelector' ):
216
+ _PopenSelector = selectors .PollSelector
217
+ else :
218
+ _PopenSelector = selectors .SelectSelector
218
219
219
220
220
221
# This lists holds Popen instances for which the underlying process had not
0 commit comments