伪终端
意思是模拟一个代码控制的 终端, 类似于你用xshell打开的终端,支持在代码中发送要执行的代码。并获取输出。
关于下面代码中的fork
这里不讲解fork函数,请自行搜索c++fork(), 讲的比较透彻
代码
import os
import pty
import sys
import time
def send_code_and_receive_output(master, code_lines):
"""
向Python解释器发送代码行,并接收执行结果。
"""
for line in code_lines:
line += '\n' # 确保每条代码行都以换行符结束
os.write(master, line.encode()) # 向Python解释器发送代码行
time.sleep(0.1) # 稍微等待一下,确保代码被解释器接收
# 读取并打印Python解释器的输出
try:
while True:
try:
output = os.read(master, 1024)
if b"exit()" in output:
break # 如果没有输出,则退出循环
print('Received output:', output.decode(), end='')
except OSError as e:
if e.errno == 11: # EAGAIN,表示当前没有可读的数据
continue
else:
raise
finally:
os.close(master) # 确保关闭主设备
# 打开一个新的伪终端
master, slave = pty.openpty()
# 创建一个子进程
pid = os.fork()
if pid == 0:
# 子进程
os.close(master) # 关闭主设备,子进程只需要从设备
os.dup2(slave, sys.stdin.fileno()) # 将从设备设置为标准输入
os.dup2(slave, sys.stdout.fileno()) # 将从设备设置为标准输出
os.dup2(slave, sys.stderr.fileno()) # 将从设备设置为标准错误
os.execvp('python', ['python']) # 启动Python解释器
else:
# 父进程
os.close(slave) # 关闭从设备,父进程只需要主设备
# 要执行的代码行
code_lines = [
'print("Hello, world!")',
'print(333)',
'print(444)',
'print(555)',
'exit()' # 添加exit()以确保Python解释器退出
]
# 发送代码并接收输出
send_code_and_receive_output(master, code_lines)
# 等待子进程结束
os.waitpid(pid, 0)