我在基于终端的进程间通信中遇到了一些类似的问题,这些问题似乎无法使用popen来解决(等等)。通过阅读pty的源代码,我最终学会了如何使用pty,其中包含了如何(以及解释为什么)让{}跳过必要的环的例子。在
当然,根据您的需要,您也可以使用pexpect!在
这是我在我自己的项目中使用的精华。请注意,我没有检查子进程是否终止;脚本是作为管理长时间运行的Java进程的守护进程运行的,因此我从不需要处理状态代码。希望这能让你得到你所需要的。在import os
import pty
import select
import termios
child_pid, child_fd = pty.fork()
if not child_pid: # child process
os.execv("/path/to/command", ["command", "arg1", "arg2"])
# disable echo
attr = termios.tcgetattr(child_fd)
attr[3] = attr[3] & ~termios.ECHO
termios.tcsetattr(child_fd, termios.TCSANOW, attr)
while True:
# check whether child terminal has output to read
ready, _, _ = select.select([child_fd], [], [])
if child_fd in ready:
output = []
try:
while True:
s = os.read(child_fd, 1)
# EOF or EOL
if not s or s == "\n":
break
# don't store carriage returns (no universal line endings)
if not s == "\r":
output.append(s)
except OSError: # this signals EOF on some platforms
pass
if output.find("Enter password:") > -1:
os.write(child_fd, "password")