如何将代码文件和终端输出重定向到同一个输出文件(模拟 python repl)?

how to I redirect both code file and terminal output to the same output file (simulating python repl)?

我想将输入代码和输出结果保存到一个文件中。例如下面的 python 代码 code.py:

print(2+2)
print(3+2)

创建 code-and-output.txt:

>>> print(2+2)
4
>>> print(3+2)
5

但我无法让它工作。基本上,我想 code-and-output.txt 捕捉如果我 运行 在 python 交互环境(代码 + 输出)中解释 python 和 运行 语句会发生什么。 到目前为止我尝试过的方法:

重定向标准输出:

python code.py > code-and-output.txt 它只保存输出。

重定向标准输出和标准输入:

python < code.py > code-and-output.txt 它做同样的事情(只输出)。

nohup

nohup python code.py 同样的问题:只输出.

脚本

script -q code-and-output.txt
python
print(2+2)
print(2+3)
ctr+d
ctr+d

它可以工作,但我需要手动完成。此外,它节省了一些我无法使用 -q 使它们安静的垃圾。

Bash 脚本

# bash-file.sh
python &
print(2+2)
print(2+3)

不起作用:控制台 bash 中的命令 运行,而不是 python。它也不适用于 &:永远不会结束 python repl.

使用 tty

打开另一个终端,如/dev/pts/2并在bash-file.sh

上方发送
cat bash-file.sh > /dev/pts/2

只是复制而不是运行。

我对 Jupyter 和 iPython 等解决方案不感兴趣。他们有自己的问题,没有解决我的要求。

任何通过 linux 命令(最好)或 python 的解决方案?谢谢。

将其另存为 repl_sim.py 在与 code.py 相同的目录中:

with open("code.py", 'r') as input_file:
    for line in input_file:
        print(f">>> {line.strip()}")
        eval(line)

然后 运行 在您的终端中使用以下命令将输出重定向到名为 code-and-output.txt 的文本文件:

python repl_sim.py > code-and-output.txt

-或-

然后 运行 在您的终端中使用以下命令查看输出以及使文本文件匹配:

python repl_sim.py  | tee code-and-output.txt

它至少适用于您提供的示例 code.py


上面第一个选项的纯 Python 版本,这样你就不需要 shell 重定向。
将此代码保存为 repl_sim.py:

import contextlib
with open('code-and-output.txt', 'w') as f:
    with contextlib.redirect_stdout(f):
        with open("code.py", 'r') as input_file:
            for line in input_file:
                print(f">>> {line.strip()}")
                eval(line)

然后 运行 在您的终端中使用:

python repl_sim.py

这将导致 code-and-output.txt 包含您想要的内容。

Contextlib 使用基于 Raymond Hettinger's August 17th 2018 Tweetcontextlib.redirect_stdout() 文档 .