使用subprocess Popen做shell窗口的会话保存

29 阅读1分钟

程序目录结果

  • DemoProject 根目录
    • path1 子目录
      • test.py 测试程序
    • demo.py shell会话保持demo

测试程序

test.py

from time import sleep

if __name__ == '__main__':
    for i in range(0, 100):
        print(f"{i}_*" * 100)
        print("\n")
        sleep(.5)

subprocess Popen

使用subprocess.Popen创建了一个子进程,并通过stdin参数将输入流连接到子进程的标准输入。然后,使用communicate方法与子进程进行交互,发送命令并获取输出结果。可以使用text=True来指定输出结果为文本形式。readline可以逐行读取shell窗口文本数据。

demo.py

import subprocess

cmds = ["cd ./path1", "cat ./test.py", "python ./test.py "]


# 创建一个子进程
process = subprocess.Popen(cmds[0], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                           text=True)

# 依次执行命令
for cmd in cmds[1:]:
    # 向子进程发送命令
    process.stdin.write(cmd + "\n")
    process.stdin.flush()

    # 逐行读取子进程的输出
    while True:
        output = process.stdout.readline()
        if output == '' and process.poll() is not None:
            break
        if output:
            print(output.strip())

    # 检查是否有错误输出
    error = process.stderr.read()
    if error:
        print(error.strip())