Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 运行subprocess.call以运行Cocoa命令行应用程序_Python_Cocoa_Subprocess - Fatal编程技术网

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

Python 运行subprocess.call以运行Cocoa命令行应用程序,python,cocoa,subprocess,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

我编写了一段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),它们也任意表现出奇怪的行为,但本质上更复杂


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

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

因为代码最初使用临时文件,所以我无法在将其传递给子进程之前关闭该文件。但是,我应该做的是在调用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)

如果我打印出命令,我会得到:['./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”,并得到了错误。您是否收到了任何特定的错误消息?您可以使用
子进程执行该程序。检查\u output
,在失败时捕获
调用的进程错误(
e
)异常,然后打印
e.output
,查看可能出现的错误。我收到了一个错误,但如上所述,它源自我的Cocoa程序。不知何故,运行Cocoa程序form subprocess.call会导致它与从命令行调用它时使用完全相同的输入时表现不同。在这种特殊情况下,Cocoa程序正在读取的XML文件(未在命令行上传递)似乎没有被正确解析。也许可以将文件('test.XML')作为temp删除
——您似乎没有从该文件读取/写入。不确定这是否会影响到事情,但这是我根据信息所能注意到的唯一其他事情。好的,所以编辑这个问题,因为为了保持问题的简单,我省略了文字。但是,在写入行中添加时,我意识到可能应该在调用subprocess.call之前刷新文件。我想这已经解决了问题。你收到了什么错误信息?