You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:55:22