与python脚本中的python REPL交互

时间:2018-09-23 13:27:20

标签: python-3.x ipython read-eval-print-loop

我想找到(或制作一个)python脚本,该脚本逐行读取另一个python脚本,并在此之后打印执行的命令和输出。

假设您有这样的Python脚本testfile.py

print("Hello world")

for i in range(3):
    print(f"i is: {i}")

现在,我想要一个不同的python脚本来解析testfile.py并输出以下内容:

print("Hello world")
## Hello world
for i in range(3):
    print(f"i is: {i}")
## i is: 0
## i is: 1
## i is: 2

任何对现有软件或新代码方面的建议都将不胜感激!


尝试/概念代码:

从python运行ipython

最早的想法之一是使用subprocess从python运行ipython:

import subprocess
import re
try:
    proc = subprocess.Popen(args=["ipython", "-i"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True)
    # Delimiter to know when to stop reading
    OUTPUT_DELIMITER = ":::EOL:::"
    # Variable to contain the entire interaction:
    output_string = ""
    # Open testfile.py
    with open("testfile.py") as file_:
        for line in file_:
            # Read command
            cmd = line.rstrip()
            # Add the command to the output string
            output_string += cmd + "\n"
            proc.stdin.write(f"{cmd}\n")
            # Print the delimiter so we know when to end:
            proc.stdin.write('print("{}")\n'.format(OUTPUT_DELIMITER))
            proc.stdin.flush()
            # Start reading output from ipython
            while True:
                thisoutput = proc.stdout.readline()
                thisoutput = thisoutput.rstrip()
                # Now check if it's the delimiter
                if thisoutput.find(OUTPUT_DELIMITER) >= 0:
                    break
                output_string += thisoutput + "\n"

except Exception as e:
    proc.stdout.close()
    proc.stdin.close()
    raise
proc.stdout.close()
proc.stdin.close()
print("-" * 4 + "START OUTPUT" + "-" * 4)
print(output_string)
print("-" * 4 + "END OUTPUT" + "-" * 4)

在这种方法中,问题变成缩进的块,例如for循环。 理想情况下,仅使用简单的python(而不是ipython)就可以实现这种功能。

2 个答案:

答案 0 :(得分:0)

这不是您想要的完全是,但是已经很接近了。 ObjectId模块的作用非常相似。

trace

so.py:
print("Hello world")
for i in range(3):
    print(f"i is: {i}")

答案 1 :(得分:0)

code.InteractiveConsole.interact 完全按照要求执行。