Python subprocess stdin.write无法写入子进程问题求助
问题分析与解决
你的代码存在几个关键问题,导致子进程无法接收并执行你写入的命令:
1. cmd /c 参数错误
cmd /c 的作用是执行指定命令后立即退出,即便你没在参数里写命令,它启动后也会直接终止,根本等不到后续写入的命令。应该改用 cmd /k,这个参数会让cmd在执行命令后保持会话运行,才能持续接收输入。
2. 命令未添加换行符
Windows的cmd终端需要换行符(\n)来确认执行命令,你直接写"dir",cmd会把它当成未完成的输入,不会执行。必须在每个命令末尾加上\n。
3. 未刷新标准输入缓冲区
默认情况下,stdin 是带缓冲的,调用write()后内容可能还留在缓冲区里,没有真正发送给子进程。每次写入后必须调用flush()强制发送数据。
4. 未处理标准错误输出
当前代码只监听了stdout,如果子进程有错误输出(比如cd data找不到目录),你看不到任何提示,建议同时监听stderr。
修正后的代码
import subprocess from threading import Thread import time def test_os(): # 改用 cmd /k 保持会话 command_to_execute = ["cmd", "/k"] run = subprocess.Popen( command_to_execute, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, bufsize=1 ) # 启动线程监听stdout和stderr Thread(target=stream_reader, args=(run.stdout, "STDOUT")).start() Thread(target=stream_reader, args=(run.stderr, "STDERR")).start() time.sleep(1) # 添加换行符并刷新 run.stdin.write("dir\n") run.stdin.flush() time.sleep(2) run.stdin.write("cd data\n") run.stdin.flush() run.stdin.write("dir\n") run.stdin.flush() return run def stream_reader(stream, stream_name): while True: line = stream.readline() if not line: break print(f"[{stream_name}] {line}", end="") if __name__ == "__main__": test_os()
内容的提问来源于stack exchange,提问作者Bram
相关产品推荐
相关产品推荐

