2

我在 Windows XP 上使用带有 C30 工具链的原始 IDE(Microchip MPLAB)。C 编译器的输出非常嘈杂,我无法控制,而且很难在输出窗口中发现实际的警告和错误。

我想编写一个 python 脚本来接收编译器的参数,用相同的参数调用编译器,过滤结果并将它们输出到stdout。然后我可以在工具链设置中用我的脚本替换编译器可执行文件。IDE 调用我的脚本并接收过滤后的编译器输出。

我执行编译器的代码如下所示:

arguments = ' '.join(sys.argv[1:])
cmd = '%s %s' % (compiler_path, arguments)
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

问题是脚本执行时会消耗参数的引号,因此如果 IDE 使用以下参数调用我的脚本:

main.c -o“main.o”

参数的值是

main.c -omain.o

最明显的解决方案是将整个参数列表放在引号中,但这需要在 IDE 中修改编译器调用代码。我也尝试过使用批处理文件,但它只能接受 9 个参数(%1 到 %9),并且使用 15+ 个参数调用编译器。

有没有办法将完全相同的参数从脚本转发到进程?

4

3 回答 3

4

将命令参数作为列表提供给 Popen:

arguments = sys.argv[1:]
cmd = [compiler_path] + arguments
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
于 2009-11-03T08:38:14.303 回答
3

正如 ChristopheD 所说,外壳会删除引号。

但是在使用 Popen 时您不需要自己创建字符串:它可以自动为您处理。你可以这样做:

import sys, subprocess
process = subprocess.Popen(sys.argv[1:], executable=compiler_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

subprocess 模块有望为您正确传递参数。

于 2009-11-03T08:35:45.027 回答
0

你的 shell 正在吃引号(python 脚本甚至从不接收它们)所以我想让它们“不变”并不容易。

于 2009-11-03T08:23:16.660 回答