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

Python中subprocess调用C++程序传入文件输入的问题及变量替换需求

解决subprocess运行程序时传入文件输入的问题

方法一:使用subprocess的stdin参数(推荐,无shell安全风险)

直接通过stdin参数传入打开的文件对象,不需要依赖shell的重定向语法:

with open(self.input_file, 'r') as input_f:
    run_result = subprocess.run(
        ['./CodeChecker'],
        stdin=input_f,
        capture_output=True,
        text=True
    )

这种方式是subprocess官方推荐的重定向输入方法,避免了shell=True带来的安全隐患(比如命令注入),同时能正确处理包含特殊字符的文件名。

方法二:使用shell=True并嵌入变量(需注意安全)

如果一定要用shell解析重定向符号,可以通过字符串格式化将变量嵌入命令,但要处理文件名中的特殊字符:

import shlex

# 用shlex.quote转义文件名,避免特殊字符导致命令错误或注入
cmd = f'./CodeChecker < {shlex.quote(self.input_file)}'
run_result = subprocess.run(
    cmd,
    shell=True,
    capture_output=True,
    text=True
)

如果文件名确定不含空格、引号等特殊字符,也可以直接用f-string拼接,但shlex.quote的方式更稳妥。

为什么最初的尝试失败?

你之前写的subprocess.run(['./CodeChecker', '<', 'test.in'])会把<和test.in当作程序的命令行参数直接传给CodeChecker,而不是让shell解析成输入重定向指令。只有当shell=True时,shell才会识别<符号并完成文件输入的重定向。

内容的提问来源于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.24 01:07:09