def interactive_open(program=None, encoding=None):
try:
if program is None:
if sys.platform=="win32":
program="cmd.exe"
else:
if "SHELL" in os.environ:
program=os.environ["SHELL"]
else:
program="/bin/sh"
encoding=None
fullargs=[program]
if sys.platform=="win32":
try:
#couldn't find a better way, none of the following methods worked for me : kernel32.SetConsoleOutputCP(), locale.getpreferredencoding(), sys.stdout.encoding
encoding="cp"+str(re.findall(r".*:\s*([0-9]+)",subprocess.check_output("chcp", shell=True))[0])
except:
pass
if program.endswith("powershell") or program.endswith("powershell.exe"):
fullargs=["powershell.exe", "-C", "-"] # trick to make powershell work without blocking
if encoding is None:
encoding=locale.getpreferredencoding()
print "Opening interactive %s (with encoding %s)..."%(program,encoding)
if sys.platform=="win32":
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags = subprocess.CREATE_NEW_CONSOLE | subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
p = Popen(fullargs, stdout=PIPE, stderr=PIPE, stdin=PIPE, bufsize=0, close_fds=ON_POSIX, universal_newlines=True, startupinfo=startupinfo)
else:
p = Popen(fullargs, stdout=PIPE, stderr=PIPE, stdin=PIPE, bufsize=0, close_fds=ON_POSIX, universal_newlines=True)
q = Queue()
q2 = Queue()
t = Thread(target=write_output, args=(p.stdout, q))
t.daemon = True
t.start()
t = Thread(target=write_output, args=(p.stderr, q2))
t.daemon = True
t.start()
t = Thread(target=flush_loop, args=(q, encoding))
t.daemon = True
t.start()
t = Thread(target=flush_loop, args=(q2, encoding))
t.daemon = True
t.start()
while True:
line = raw_input()
p.stdin.write(line+"\n")
p.stdin.flush()
if line.strip()=="exit":
break
except Exception as e:
print(traceback.format_exc())
评论列表
文章目录