运行subprocess.call以运行Cocoa命令行应用程序

时间:2010-07-19 18:12:41

标签: python cocoa subprocess

我有一段我编写的Cocoa代码,它接收一个包含边界框的XML文件,然后在视频上绘制(每个框都有一个关联的框架)。 Cocoa程序应该从命令行运行(并将其所有参数作为命令行参数)

我可以使用任何XML文档运行程序。但是,当我尝试从Python脚本中运行程序时,我遇到了问题。例如:

with file("test.xml") as temp:
    temp.write(doc.toprettyxml())
    # cval is my cocoa program to call, the other arguments are given to the Python script and parsed with optparser
    command = ["./cval", "-o", options.output, "-i", str(options.interval), "-s", "%dx%d" %    (options.width, options.height), "-f", str(options.frames), "-x", temp.name]
    subprocess.call(command)

有时这会导致我的'cval'失败,有时则不会(更改XML文档中的一个数字会改变其行为)。我还可以在尝试读取不存在的XML元素时验证它是否正在破坏。只是,我可以打开'test.xml',并验证该元素确实存在。

但是,如果我然后使用'test.xml'自己运行'cval'(在Python脚本之外),它可以正常工作。这让我相信当我做'subprocess.call'时会发生一些奇怪的事情,但我不确定它会是什么。我有其他Cocoa / Python混合,完成不同的任务(即不使用XML),任意表现出奇怪的行为,但本质上更复杂。

我希望有人也可能遇到这个问题,或者可能知道调试这个怪异的下一步。

2 个答案:

答案 0 :(得分:1)

因为代码最初使用临时文件,所以在将文件传递给子进程之前我无法关闭它。但是,我应该做的是在调用subprocess.call之前刷新文件。不一致的行为可能是由于输入的大小导致在不同阈值处自动刷新。

代码应为:

with file("test.xml") as temp:
    temp.write(doc.toprettyxml())
    temp.flush()
    command = ["./cval", "-o", options.output, "-i", str(options.interval), "-s", "%dx%d" %    (options.width, options.height), "-f", str(options.frames), "-x", temp.name]
    subprocess.call(command)

答案 1 :(得分:0)

subprocess.call的返回码表示错误时,可能会尝试在其中放置“print command”语句。失败时,查看子进程执行的内容与命令行可能运行的内容之间是否存在任何差异。另外,尝试调用subprocess.call(command, shell=True),这样就可以像在shell中一样执行命令(使用字符串格式化等)。