我與基於終端的進程間通信,這似乎不是可解使用popen
一些類似的問題(等人)中。我結束了學習如何通過閱讀pexpect源,其中包含(和爲什麼評論)獲得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")
這是一堆很好的代碼來挖掘(但相信我,我打算)。是否有機會在此發佈重要摘要? – user648855 2011-03-07 22:26:44
我會,但在工作時無法使用該機器。如果您可以等待大約五個小時(對不起),我很樂意在回家時發佈一些示例。 – 2011-03-07 22:31:48
對不起!忘了發佈此更早。 – 2011-03-08 07:09:13