【问题标题】:Forwarding command line arguments to a process in Python将命令行参数转发到 Python 中的进程
【发布时间】:2010-12-12 13:29:45
【问题描述】:

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

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

【问题讨论】:

  • 一个批处理文件可以接受10多个参数,查一下SHIFT的使用

标签: python process arguments quotes command-line-arguments


【解决方案1】:

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

【讨论】:

  • 如果在调用 Python 时 shell 正在吃掉它们,这不是问题。当单独为编译器使用相同的参数时,它也应该吃掉它们。所以使用 sys.argv 会给你同样的结果。我确实建议将 args 作为列表传递给 Popen,而不是单个字符串。使用前者,您可以准确控制命令的每个参数是什么,而不必担心转义。 (如果您的任何命令有空格怎么办?)
  • 非常真实的话。好吧,为了完整起见,我会留下这个答案(并且因为信息丰富的评论)。
  • 我不确定这个答案是否正确。提问者提到编写“批处理脚本”这一事实可能表明他正在使用 Windows——在这种情况下,shell 不会吃引号;它们被逐字传递以供可执行文件的运行时处理。这就提出了一个不同的问题:Python 是否提供了任何方式来查看由 Windows C 运行时人工构建的“sys.argv”“背后”,并查看实际传递给新生成的进程的真实的逐字命令行?
【解决方案2】:

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

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

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

子流程模块有望为您正确传递参数。

【讨论】:

【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2015-07-08
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多