通过管道传输 Python 子进程中的用户输入和用户输出?

Piping user input and user output from a Python subprocess?

提问人:Isabella Brooks 提问时间:8/8/2023 最后编辑:Isabella Brooks 更新时间:8/9/2023 访问量:27

问:

我正在编写一个 python 程序来运行另一个 python 程序,并将其输入和输出通过管道传输到不同的日志文件中。

我尝试创建这个,但它似乎过早地关闭了文件:

import subprocess
import shlex

def main():
  program_filename = "calculator.py" 
  input_log_filename = "user_input.log"
  output_log_filename = "program_output.log"

  with open(input_log_filename, "w") as input_log, open(output_log_filename, "w") as output_log:

    print("Calculator program is running.")
    
    command = f"python3 {program_filename}"
    process = subprocess.Popen(shlex.split(command), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1)
    
    while True:
        program_output, _ = process.communicate(timeout=1)
        if program_output:
            output_log.write(program_output)
        print("Program Output:", program_output.strip())

        user_input = input("Enter input: ")
        if user_input.lower() == "exit":
            break

        input_log.write(user_input + "\n")  
        process_input = user_input + "\n"
        process.stdin.write(process_input)
        process.stdin.flush()
      
    process.stdin.close()
    process.stdout.close()
    process.stderr.close()

if __name__ == "__main__":
  main()
python io 子进程 python-logging

评论

0赞 Community 8/8/2023
请修剪您的代码,以便更轻松地找到您的问题。请遵循以下准则,创建一个最小的可重现示例
0赞 Kurtis Rader 8/9/2023
你的问题有两个问题。你写道“它似乎过早地关闭了文件”。您需要扩展它以告诉我们您观察到的行为以及您的期望。您正在运行一个名为 但未向我们显示该程序的程序。我假设当您直接从 shell 提示符运行它时它可以正常工作。我建议用一个微不足道的程序替换它,该程序除了回显其输入之外什么都不做(并向我们展示该程序)。calculator.py

答: 暂无答案