| import os | 
 | import sys | 
 | import string | 
 |  | 
 | MAXFD = 100	# Max number of file descriptors (os.getdtablesize()???) | 
 |  | 
 | def popen2(cmd): | 
 | 	cmd = string.split(cmd) | 
 | 	p2cread, p2cwrite = os.pipe() | 
 | 	c2pread, c2pwrite = os.pipe() | 
 | 	pid = os.fork() | 
 | 	if pid == 0: | 
 | 		# Child | 
 | 		os.close(0) | 
 | 		os.close(1) | 
 | 		if os.dup(p2cread) <> 0: | 
 | 			sys.stderr.write('popen2: bad read dup\n') | 
 | 		if os.dup(c2pwrite) <> 1: | 
 | 			sys.stderr.write('popen2: bad write dup\n') | 
 | 		for i in range(3, MAXFD): | 
 | 			try: | 
 | 				os.close(i) | 
 | 			except: | 
 | 				pass | 
 | 		try: | 
 | 			os.execv(cmd[0], cmd) | 
 | 		finally: | 
 | 			os._exit(1) | 
 | 		# Shouldn't come here, I guess | 
 | 		os._exit(1) | 
 | 	os.close(p2cread) | 
 | 	tochild = os.fdopen(p2cwrite, 'w') | 
 | 	os.close(c2pwrite) | 
 | 	fromchild = os.fdopen(c2pread, 'r') | 
 | 	return fromchild, tochild |