You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python脚本中调用script命令记录终端IO且无需进入新Shell?

解决Python中无需新开Shell即可记录所有终端交互的问题

我太懂这个坑了!你用script命令的时候,它会直接新开一个独立的shell,你的Python脚本就卡在那里等着这个shell退出,后面的交互代码根本没机会跑起来——这就是为啥你只看到那句“Script started...”的原因。

想要不依赖script命令、也不用新开shell的话,咱们可以直接在Python里捕获所有输入输出,同时同步记录到文件里。下面给你两种实用的方案:

方案一:纯Python实现IO双写(终端+日志文件)

这个方法通过重定向sys.stdout和sys.stderr,让所有输出同时显示在终端和写入日志文件,再自定义input函数来捕获用户输入并记录,完全在当前Python进程内完成,不会新开任何子shell。

import sys

class TerminalLogger:
    def __init__(self, log_path):
        # 保存原始的终端输出对象
        self.original_stdout = sys.stdout
        self.original_stderr = sys.stderr
        # 打开日志文件(追加模式)
        self.log_file = open(log_path, "a", encoding="utf-8")
    
    def write(self, message):
        # 同时输出到终端和日志文件
        self.original_stdout.write(message)
        self.log_file.write(message)
        self.log_file.flush()  # 确保内容实时写入文件,避免缓存
    
    def flush(self):
        # 兼容标准输出的flush方法
        self.original_stdout.flush()
        self.log_file.flush()

def logged_input(prompt):
    # 自定义input函数,同时记录提示和用户输入
    print(prompt, end="")  # 打印提示(会被Logger捕获记录)
    user_input = sys.stdin.readline()
    # 把用户输入写入日志
    sys.stdout.log_file.write(user_input)
    sys.stdout.log_file.flush()
    return user_input.strip()

# ---------------------- 启用日志记录 ----------------------
logger = TerminalLogger("logfile.log")
sys.stdout = logger
sys.stderr = logger  # 把错误输出也同步记录

# ---------------------- 你的交互代码 ----------------------
print("欢迎进入交互模式!")
name = logged_input("请输入你的名字:")
print(f"你好,{name}!")
age = logged_input("请输入你的年龄:")
print(f"明年你就{int(age)+1}岁啦~")

# ---------------------- 关闭日志并恢复原始输出 ----------------------
sys.stdout.log_file.close()
sys.stdout = logger.original_stdout
sys.stderr = logger.original_stderr

这个方案的优点:

  • 完全在当前Python进程内运行,没有额外的shell开销
  • 可以灵活控制哪些内容需要记录,甚至添加时间戳等额外信息
  • 兼容所有Python的标准输入输出操作(print、input、traceback等)

方案二:用script -c指定要运行的代码(适合简单场景)

如果你非要用script命令,也可以通过-c参数直接指定要执行的命令,这样script会在新开的shell里运行你的代码并记录,但注意这还是会启动子shell,不过能让你的代码和日志记录同时工作:

from subprocess import call

# 把你的交互代码写成字符串,传给script命令
my_code = """
echo "欢迎进入交互模式!"
read -p "请输入你的名字:" name
echo "你好,$name!"
read -p "请输入你的年龄:" age
echo "明年你就$((age+1))岁啦~"
"""

# 用script执行这段代码并记录到日志
call(["script", "-c", my_code, "logfile.log"])

不过这个方案更适合简单的shell命令交互,如果你的逻辑是用Python写的,还是方案一更合适。

内容的提问来源于stack exchange,提问作者user7355384

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:24:55