【发布时间】:2021-12-25 07:55:35
【问题描述】:
这个问题类似于Run interactive Bash with popen and a dedicated TTY Python,除了我想在“哑”终端(TERM=dumb)中运行 Bash,并且不将 tty 置于原始模式。
下面的代码是我的尝试。该代码类似于链接问题中给出的解决方案,主要区别在于它没有将 tty 置于原始模式,而是设置TERM=dumb。
import os
import pty
import select
import subprocess
import sys
master_fd, slave_fd = pty.openpty()
p = subprocess.Popen(['bash'],
stdin=slave_fd,
stdout=slave_fd,
stderr=slave_fd,
# Run in a new process group to enable bash's job control.
preexec_fn=os.setsid,
# Run bash in "dumb" terminal.
env=dict(os.environ, TERM='dumb'))
while p.poll() is None:
r, w, e = select.select([sys.stdin, master_fd], [], [])
if sys.stdin in r:
user_input = os.read(sys.stdin.fileno(), 10240)
os.write(master_fd, user_input)
elif master_fd in r:
output = os.read(master_fd, 10240)
os.write(sys.stdout.fileno(), output)
上面的代码有两个问题:
- 无论用户输入什么,代码都会重新回显。例如,如果用户输入
printf '',上面的代码将在下一行打印printf '',然后再打印下一个 bash 提示符。 -
Ctrlc 和 Ctrld 的行为与
bash中的预期不同。
我应该如何解决这些问题?
【问题讨论】: