2009-11-03 68 views
3

的过程我用粗IDE(Microchip的MPLAB)在Windows XP C30工具链。 C编译器有一个非常嘈杂的输出,我无法控制,并且很难在输出窗口中发现实际的警告和错误。转发命令行参数在Python

我想编写一个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调用代码修改。我也尝试使用批处理文件,但它只能接受九个参数(%1到%9),并且编译器被调用了15个参数。

有没有一种方法完全相同的参数转发到从脚本的程序?

+1

一个批处理文件,可以接受超过10个参数,查找使用SHIFT – 2009-11-03 08:42:49

回答

-1

你的shell是吃引号(在Python脚本甚至从来没有收到他们),所以我想这是不是很容易让他们“不变”。

+3

。如果壳吃它们时Python会被调用,这个ISN没问题。单独使用相同的参数时,它也应该吃掉它们。所以使用sys.argv会给你相同的结果。 我建议传递ARGS的列表POPEN,而不是一个字符串。与前者一样,您可以精确控制命令的每个参数,而不必担心转义。 (如果你的任何命令有空格呢?) – AFoglia 2009-11-03 08:38:20

+0

非常真实的评论。那么,我会为了完整而留下这个答案(并且因为内容丰富的评论)。 – ChristopheD 2009-11-03 08:41:25

+0

我不确定这个答案是否正确。提问者提到编写“批处理脚本”的事实可能表明他正在使用Windows - 在这种情况下,shell不会使用引号;它们会逐字传递给可执行文件的运行时间进行处理。这引发了一个不同的问题:Python是否提供了任何方式来查看由Windows C运行时人为构建的“sys.argv”后面,并查看实际传递给新产生的进程的真实的逐字命令行? – 2010-08-31 13:22:40

3

由于ChristopheD上述外壳去掉引号。

但你并不需要使用POPEN时自己创建的字符串:它可以自动处理,对你。你可以这样做:

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

子进程模块希望能够正确地为你传递参数。

+2

“'executable'参数指定要执行的程序,它很少需要:通常,要执行的程序由'args'参数定义。” http://docs.python.org/library/subprocess.html – hcs42 2009-11-03 08:58:55

4

发出命令,参数POPEN作为一个列表:

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