5
mswindows=(sys.platform=="win32")
10
class CalledProcessError(Exception):
11
def __init__(self,returncode,cmd):
12
self.returncode=returncode
15
return"Command '%s' returned non-zero exit status %d"%(self.cmd,self.returncode)
21
from win32api import GetStdHandle,STD_INPUT_HANDLE,STD_OUTPUT_HANDLE,STD_ERROR_HANDLE
22
from win32api import GetCurrentProcess,DuplicateHandle,GetModuleFileName,GetVersion
23
from win32con import DUPLICATE_SAME_ACCESS,SW_HIDE
24
from win32pipe import CreatePipe
25
from win32process import CreateProcess,STARTUPINFO,GetExitCodeProcess,STARTF_USESTDHANDLES,STARTF_USESHOWWINDOW,CREATE_NEW_CONSOLE
26
from win32event import WaitForSingleObject,INFINITE,WAIT_OBJECT_0
28
from _subprocess import*
42
__all__=["Popen","PIPE","STDOUT","call","check_call","CalledProcessError"]
44
MAXFD=os.sysconf("SC_OPEN_MAX")
54
for inst in _active[:]:
55
if inst.poll(_deadstate=sys.maxint)>=0:
62
def call(*popenargs,**kwargs):
63
return Popen(*popenargs,**kwargs).wait()
64
def check_call(*popenargs,**kwargs):
65
retcode=call(*popenargs,**kwargs)
66
cmd=kwargs.get("args")
70
raise CalledProcessError(retcode,cmd)
72
def list2cmdline(seq):
79
needquote=(" "in arg)or("\t"in arg)or arg==""
86
result.append('\\'*len(bs_buf)*2)
101
def __init__(self,args,bufsize=0,executable=None,stdin=None,stdout=None,stderr=None,preexec_fn=None,close_fds=False,shell=False,cwd=None,env=None,universal_newlines=False,startupinfo=None,creationflags=0):
103
self._child_created=False
104
if not isinstance(bufsize,(int,long)):
105
raise TypeError("bufsize must be an integer")
107
if preexec_fn is not None:
108
raise ValueError("preexec_fn is not supported on Windows platforms")
110
raise ValueError("close_fds is not supported on Windows platforms")
112
if startupinfo is not None:
113
raise ValueError("startupinfo is only supported on Windows platforms")
115
raise ValueError("creationflags is only supported on Windows platforms")
121
self.universal_newlines=universal_newlines
122
(p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite)=self._get_handles(stdin,stdout,stderr)
123
self._execute_child(args,executable,preexec_fn,close_fds,cwd,env,universal_newlines,startupinfo,creationflags,shell,p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite)
125
if stdin is None and p2cwrite is not None:
128
if stdout is None and c2pread is not None:
131
if stderr is None and errread is not None:
135
self.stdin=os.fdopen(p2cwrite,'wb',bufsize)
137
if universal_newlines:
138
self.stdout=os.fdopen(c2pread,'rU',bufsize)
140
self.stdout=os.fdopen(c2pread,'rb',bufsize)
142
if universal_newlines:
143
self.stderr=os.fdopen(errread,'rU',bufsize)
145
self.stderr=os.fdopen(errread,'rb',bufsize)
146
def _translate_newlines(self,data):
147
data=data.replace("\r\n","\n")
148
data=data.replace("\r","\n")
150
def __del__(self,sys=sys):
151
if not self._child_created:
153
self.poll(_deadstate=sys.maxint)
154
if self.returncode is None and _active is not None:
156
def communicate(self,input=None):
157
if[self.stdin,self.stdout,self.stderr].count(None)>=2:
162
self.stdin.write(input)
165
stdout=self.stdout.read()
167
stderr=self.stderr.read()
169
return(stdout,stderr)
170
return self._communicate(input)
172
def _get_handles(self,stdin,stdout,stderr):
173
if stdin is None and stdout is None and stderr is None:
174
return(None,None,None,None,None,None)
175
p2cread,p2cwrite=None,None
176
c2pread,c2pwrite=None,None
177
errread,errwrite=None,None
179
p2cread=GetStdHandle(STD_INPUT_HANDLE)
180
if p2cread is not None:
182
elif stdin is None or stdin==PIPE:
183
p2cread,p2cwrite=CreatePipe(None,0)
184
p2cwrite=p2cwrite.Detach()
185
p2cwrite=msvcrt.open_osfhandle(p2cwrite,0)
186
elif isinstance(stdin,int):
187
p2cread=msvcrt.get_osfhandle(stdin)
189
p2cread=msvcrt.get_osfhandle(stdin.fileno())
190
p2cread=self._make_inheritable(p2cread)
192
c2pwrite=GetStdHandle(STD_OUTPUT_HANDLE)
193
if c2pwrite is not None:
195
elif stdout is None or stdout==PIPE:
196
c2pread,c2pwrite=CreatePipe(None,0)
197
c2pread=c2pread.Detach()
198
c2pread=msvcrt.open_osfhandle(c2pread,0)
199
elif isinstance(stdout,int):
200
c2pwrite=msvcrt.get_osfhandle(stdout)
202
c2pwrite=msvcrt.get_osfhandle(stdout.fileno())
203
c2pwrite=self._make_inheritable(c2pwrite)
205
errwrite=GetStdHandle(STD_ERROR_HANDLE)
206
if errwrite is not None:
208
elif stderr is None or stderr==PIPE:
209
errread,errwrite=CreatePipe(None,0)
210
errread=errread.Detach()
211
errread=msvcrt.open_osfhandle(errread,0)
214
elif isinstance(stderr,int):
215
errwrite=msvcrt.get_osfhandle(stderr)
217
errwrite=msvcrt.get_osfhandle(stderr.fileno())
218
errwrite=self._make_inheritable(errwrite)
219
return(p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite)
220
def _make_inheritable(self,handle):
221
return DuplicateHandle(GetCurrentProcess(),handle,GetCurrentProcess(),0,1,DUPLICATE_SAME_ACCESS)
222
def _find_w9xpopen(self):
223
w9xpopen=os.path.join(os.path.dirname(GetModuleFileName(0)),"w9xpopen.exe")
224
if not os.path.exists(w9xpopen):
225
w9xpopen=os.path.join(os.path.dirname(sys.exec_prefix),"w9xpopen.exe")
226
if not os.path.exists(w9xpopen):
227
raise RuntimeError("Cannot locate w9xpopen.exe, which is needed for Popen to work with your shell or platform.")
229
def _execute_child(self,args,executable,preexec_fn,close_fds,cwd,env,universal_newlines,startupinfo,creationflags,shell,p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite):
230
if not isinstance(args,types.StringTypes):
231
args=list2cmdline(args)
232
if startupinfo is None:
233
startupinfo=STARTUPINFO()
234
if None not in(p2cread,c2pwrite,errwrite):
235
startupinfo.dwFlags|=STARTF_USESTDHANDLES
236
startupinfo.hStdInput=p2cread
237
startupinfo.hStdOutput=c2pwrite
238
startupinfo.hStdError=errwrite
240
startupinfo.dwFlags|=STARTF_USESHOWWINDOW
241
startupinfo.wShowWindow=SW_HIDE
242
comspec=os.environ.get("COMSPEC","cmd.exe")
243
args=comspec+" /c "+args
244
if(GetVersion()>=0x80000000L or os.path.basename(comspec).lower()=="command.com"):
245
w9xpopen=self._find_w9xpopen()
246
args='"%s" %s'%(w9xpopen,args)
247
creationflags|=CREATE_NEW_CONSOLE
249
hp,ht,pid,tid=CreateProcess(executable,args,None,None,1,creationflags,env,cwd,startupinfo)
250
except pywintypes.error,e:
251
raise WindowsError(*e.args)
252
self._child_created=True
256
if p2cread is not None:
258
if c2pwrite is not None:
260
if errwrite is not None:
262
def poll(self,_deadstate=None):
263
if self.returncode is None:
264
if WaitForSingleObject(self._handle,0)==WAIT_OBJECT_0:
265
self.returncode=GetExitCodeProcess(self._handle)
266
return self.returncode
268
if self.returncode is None:
269
obj=WaitForSingleObject(self._handle,INFINITE)
270
self.returncode=GetExitCodeProcess(self._handle)
271
return self.returncode
272
def _readerthread(self,fh,buffer):
273
buffer.append(fh.read())
274
def _communicate(self,input):
279
stdout_thread=threading.Thread(target=self._readerthread,args=(self.stdout,stdout))
280
stdout_thread.setDaemon(True)
281
stdout_thread.start()
284
stderr_thread=threading.Thread(target=self._readerthread,args=(self.stderr,stderr))
285
stderr_thread.setDaemon(True)
286
stderr_thread.start()
288
if input is not None:
289
self.stdin.write(input)
295
if stdout is not None:
297
if stderr is not None:
299
if self.universal_newlines and hasattr(file,'newlines'):
301
stdout=self._translate_newlines(stdout)
303
stderr=self._translate_newlines(stderr)
305
return(stdout,stderr)
307
def _get_handles(self,stdin,stdout,stderr):
308
p2cread,p2cwrite=None,None
309
c2pread,c2pwrite=None,None
310
errread,errwrite=None,None
314
p2cread,p2cwrite=os.pipe()
315
elif isinstance(stdin,int):
318
p2cread=stdin.fileno()
322
c2pread,c2pwrite=os.pipe()
323
elif isinstance(stdout,int):
326
c2pwrite=stdout.fileno()
330
errread,errwrite=os.pipe()
333
elif isinstance(stderr,int):
336
errwrite=stderr.fileno()
337
return(p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite)
338
def _set_cloexec_flag(self,fd):
340
cloexec_flag=fcntl.FD_CLOEXEC
341
except AttributeError:
343
old=fcntl.fcntl(fd,fcntl.F_GETFD)
344
fcntl.fcntl(fd,fcntl.F_SETFD,old|cloexec_flag)
345
def _close_fds(self,but):
346
for i in xrange(3,MAXFD):
353
def _execute_child(self,args,executable,preexec_fn,close_fds,cwd,env,universal_newlines,startupinfo,creationflags,shell,p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite):
354
if isinstance(args,types.StringTypes):
359
args=["/bin/sh","-c"]+args
360
if executable is None:
362
errpipe_read,errpipe_write=os.pipe()
363
self._set_cloexec_flag(errpipe_write)
364
gc_was_enabled=gc.isenabled()
372
self._child_created=True
381
os.close(errpipe_read)
388
if p2cread and p2cread not in(0,):
390
if c2pwrite and c2pwrite not in(p2cread,1):
392
if errwrite and errwrite not in(p2cread,c2pwrite,2):
395
self._close_fds(but=errpipe_write)
401
os.execvp(executable,args)
403
os.execvpe(executable,args,env)
405
exc_type,exc_value,tb=sys.exc_info()
406
exc_lines=traceback.format_exception(exc_type,exc_value,tb)
407
exc_value.child_traceback=''.join(exc_lines)
408
os.write(errpipe_write,pickle.dumps(exc_value))
412
os.close(errpipe_write)
413
if p2cread and p2cwrite:
415
if c2pwrite and c2pread:
417
if errwrite and errread:
419
data=os.read(errpipe_read,1048576)
420
os.close(errpipe_read)
422
os.waitpid(self.pid,0)
423
child_exception=pickle.loads(data)
424
raise child_exception
425
def _handle_exitstatus(self,sts):
426
if os.WIFSIGNALED(sts):
427
self.returncode=-os.WTERMSIG(sts)
428
elif os.WIFEXITED(sts):
429
self.returncode=os.WEXITSTATUS(sts)
431
raise RuntimeError("Unknown child exit status!")
432
def poll(self,_deadstate=None):
433
if self.returncode is None:
435
pid,sts=os.waitpid(self.pid,os.WNOHANG)
437
self._handle_exitstatus(sts)
439
if _deadstate is not None:
440
self.returncode=_deadstate
441
return self.returncode
443
if self.returncode is None:
444
pid,sts=os.waitpid(self.pid,0)
445
self._handle_exitstatus(sts)
446
return self.returncode
447
def _communicate(self,input):
455
write_set.append(self.stdin)
459
read_set.append(self.stdout)
462
read_set.append(self.stderr)
465
while read_set or write_set:
466
rlist,wlist,xlist=select.select(read_set,write_set,[])
467
if self.stdin in wlist:
468
bytes_written=os.write(self.stdin.fileno(),buffer(input,input_offset,512))
469
input_offset+=bytes_written
470
if input_offset>=len(input):
472
write_set.remove(self.stdin)
473
if self.stdout in rlist:
474
data=os.read(self.stdout.fileno(),1024)
477
read_set.remove(self.stdout)
479
if self.stderr in rlist:
480
data=os.read(self.stderr.fileno(),1024)
483
read_set.remove(self.stderr)
485
if stdout is not None:
486
stdout=''.join(stdout)
487
if stderr is not None:
488
stderr=''.join(stderr)
489
if self.universal_newlines and hasattr(file,'newlines'):
491
stdout=self._translate_newlines(stdout)
493
stderr=self._translate_newlines(stderr)
495
return(stdout,stderr)