运行subprocess.call以执行Cocoa命令行应用程序
我写了一段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脚本之外自己运行'cval',并用'test.xml',它就能正常工作。这让我觉得在使用'subprocess.call'时发生了一些奇怪的事情,但我不太确定是什么原因。我还有其他Cocoa和Python结合的程序,它们做的事情完全不同(比如不使用XML),但也会莫名其妙地出现奇怪的行为,而且这些程序更复杂。
我希望有人也遇到过这个问题,或者知道接下来该怎么调试这个奇怪的情况。
2 个回答
0
也许可以试着在那里面加一个“打印命令”的语句,当subprocess.call
的返回代码显示出错时。出错的时候,看看通过subprocess执行的内容和你在命令行中运行的内容有没有什么不同。另外,试着调用subprocess.call(command, shell=True)
,这样你的命令就会像在命令行中一样执行(包括字符串格式化等)。
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)