在Python中将命令行参数转发到进程

2 投票
3 回答
3397 浏览
提问于 2025-04-15 15:37

我在Windows XP上使用一个简单的开发环境(Microchip MPLAB)和C30工具链。这个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"

那么arguments的值就是:

main.c -omain.o

最明显的解决办法是把整个参数列表放在引号里,但这需要修改IDE中调用编译器的代码。我也尝试过使用批处理文件,但它最多只能接受九个参数(%1到%9),而编译器调用时有15个以上的参数。

有没有办法从脚本中准确地转发相同的参数给一个进程呢?

3 个回答

3

正如ChristopheD所说,命令行会去掉引号。

不过,当你使用Popen的时候,其实你不需要自己去创建字符串:它可以自动帮你处理这些。你可以这样做:

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

希望subprocess模块能正确地传递参数给你。

4

把命令的参数作为一个列表传给Popen:

arguments = sys.argv[1:]
cmd = [compiler_path] + arguments
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
0

你的命令行界面把引号给吞掉了(Python脚本根本没收到这些引号),所以我想要把它们“原封不动”地传过去并不太容易。

撰写回答