Python subprocess执行leaks命令并从变量传输入遇问题求助
解决Python subprocess执行
leaks -atExit -- ./a.out | grep LEAK时从变量传入输入的问题 问题出在你原来的命令里的< test.in是shell层面的文件重定向,当加入leaks和管道后,直接用input参数会导致输入没有正确传递给./a.out——因为shell会优先处理< test.in的重定向逻辑,而非接收你通过subprocess传入的输入。
下面是两种可行的解决方法:
方法一:使用shell=True(简单直观,注意安全)
去掉命令里的< test.in,直接通过subprocess的input参数把变量内容传递给shell,shell会自动将输入传递给leaks启动的./a.out,同时保留管道逻辑:
import subprocess # 替换成你的实际输入内容 input_content = "这里是要传给./a.out的输入" # 去掉< test.in,保留leaks和grep的管道 cmd = "leaks -atExit -- ./a.out | grep LEAK" # 执行命令,通过input传入变量内容,捕获输出 result = subprocess.run( cmd, shell=True, input=input_content.encode(), # 字符串转字节流,若用text=True可直接传字符串 capture_output=True, text=True # 自动处理编码,输出为字符串 ) # 打印结果 print(result.stdout) # 若需要调试错误信息,可打印result.stderr # print(result.stderr)
方法二:不使用shell=True(更安全,避免shell注入风险)
手动创建进程管道,将leaks的输出直接传给grep,同时把输入写入leaks的stdin(./a.out会继承leaks的stdin,从而拿到输入):
import subprocess input_content = "这里是要传给./a.out的输入" # 先启动grep进程,准备接收leaks的输出 grep_process = subprocess.Popen( ["grep", "LEAK"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) # 启动leaks进程,stdout对接grep的stdin,stdin设为管道用于传递输入 leaks_process = subprocess.Popen( ["leaks", "-atExit", "--", "./a.out"], stdin=subprocess.PIPE, stdout=grep_process.stdin, stderr=subprocess.PIPE, text=True ) # 将输入内容写入leaks的stdin,传递给./a.out leaks_process.stdin.write(input_content) leaks_process.stdin.close() # 关闭stdin,告知./a.out输入结束 # 等待grep进程完成,获取输出 grep_out, grep_err = grep_process.communicate() # 读取leaks的错误输出(如果需要调试) leaks_err = leaks_process.stderr.read() print(grep_out) # print(leaks_err)
关键说明
- 必须去掉原命令中的
< test.in,否则shell会尝试读取文件,忽略你通过subprocess传入的输入。 leaks作为./a.out的父进程,./a.out会继承leaks的stdin,所以给leaks传输入等价于给./a.out传输入。
内容的提问来源于stack exchange,提问作者piotr lezanski
相关产品推荐
相关产品推荐

