如何在Python脚本中正确执行带错误重定向的strace+gcc命令
解决subprocess执行带重定向命令报错的问题
问题原因
2>log.txt是shell的重定向语法,subprocess默认会把每个参数当作命令的字面参数处理,不会让shell解析这些特殊符号,所以它会把2>log.txt当成一个要执行的文件/参数,自然找不到对应的文件,导致报错。
两种解决方法
方法1:通过shell执行整个命令
给subprocess添加shell=True参数,让命令通过系统shell解析,这样shell会处理重定向逻辑:
import subprocess # 直接传入完整的shell命令字符串 cmd = 'strace -e write -f gcc -I/home/user/my_test/headers -fsyntax-only test_file.c 2>log.txt' subprocess.run(cmd, shell=True)
注意:如果命令中包含用户可控的输入,这种方式存在shell注入风险,仅在命令完全可控时使用。
方法2:利用subprocess自身的重定向参数(推荐)
不用依赖shell,直接通过subprocess的stderr参数指定错误输出的文件对象,这是更安全的做法:
import subprocess # 以写入模式打开log文件,将stderr重定向到该文件 with open('log.txt', 'w') as log_file: subprocess.run( # 命令拆分为列表形式(每个参数单独成项) ['strace', '-e', 'write', '-f', 'gcc', '-I/home/user/my_test/headers', '-fsyntax-only', 'test_file.c'], stderr=log_file )
这种方式避免了shell解析,没有注入风险,是subprocess执行命令的标准推荐写法。
内容的提问来源于stack exchange,提问作者pekoms
相关产品推荐
相关产品推荐

