subprocess.Popen的stdin.write失效及进程保持需求求助
问题描述
- 调用外部程序时,通过
subprocess.Popen创建进程后,使用p.stdin.write写入命令无响应 - 尝试用
subprocess.check_call()替代,会为每个步骤新建进程,导致之前的进程终止,不符合需求 - 示例场景:想选择第4号力场,用
subprocess.call([path,4])会报错,程序菜单直接消失
问题原因及修复方案
核心问题
你的代码存在两个关键问题:
- 命令字符串拼接时,参数之间没有空格,程序无法识别正确的命令格式
- 写入输入后没有刷新缓冲区,数据未实际发送到子进程;同时缺少换行符,交互式程序无法确认输入
修复后的代码示例
import subprocess # 假设path为目标程序路径,pname、water_model、force_field为已定义的全局变量 p = subprocess.Popen(path, stdin=subprocess.PIPE, shell=False, universal_newlines=True) # 先写入力场选择(比如第4号,必须加换行符触发确认) p.stdin.write("4\n") p.stdin.flush() # 正确拼接命令参数,每个选项与参数间用空格分隔,末尾加换行 command = f"pdb2gmx -f {pname} -o processed.gro -water {water_model} -ff {force_field}\n" p.stdin.write(command) p.stdin.flush() # 等待子进程执行完成并获取返回码 return_code = p.wait()
关键注意事项
- 参数分隔:命令的每个选项(如
-f、-o)和对应参数之间必须用空格分隔,否则程序会将连在一起的字符串视为单个无效参数 - 换行触发:交互式程序需要通过换行符来确认输入,否则会一直处于等待输入的状态
- 缓冲区刷新:调用
p.stdin.flush()确保写入的数据立即发送到子进程,避免数据滞留在缓冲区中 - 安全模式:保持
shell=False,避免潜在的命令注入风险
内容的提问来源于stack exchange,提问作者Milind Chauhan
相关产品推荐
相关产品推荐

