【问题标题】:Running subprocess.call to run a Cocoa command-line application运行 subprocess.call 以运行 Cocoa 命令行应用程序
【发布时间】:2010-07-19 18:12:40
【问题描述】:

我编写了一段 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”,并验证该元素确实存在。

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

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

【问题讨论】:

  • 你得到什么错误信息?

标签: python cocoa subprocess


【解决方案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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果我打印出命令,我会得到:['./cval', '-o', 'valtest.mp4', '-i', '0.1', '-s', ' 800x600', '-f', '60', '-x', 'valtest.xml']' 如果我在命令行上运行等效项,它工作正常:./cval -o valtest.mp4 -i 0.1 -s 800x600 -f 60 -x valtest.xml 我尝试使用'shell=True',得到了错误。
    • 您是否收到任何特定的错误消息?您可以使用subprocess.check_output 执行程序,当它失败时捕获CalledProcessError 异常(e),然后打印e.output 看看可能出了什么问题。
    • 我收到一个错误,但如上所述,它源于我的 Cocoa 程序。不知何故,以 subprocess.call 形式运行 Cocoa 程序会导致它的行为与从命令行调用时完全相同的输入不同。在这种特殊情况下,Cocoa 程序正在读取的 XML 文件(未在命令行上传递)似乎没有被正确解析。
    • 也许删除with file('test.xml') as temp——你似乎没有从那个文件读/写。不确定这是否会影响事情,但这是我唯一能根据信息注意到的其他事情。
    • 好的,所以刚刚编辑了这个问题,因为为了让问题保持简单,我省略了写。但是,在添加写入行时,我意识到我可能应该在调用 subprocess.call 之前刷新文件。我认为这解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2016-06-18
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多