Python subprocess.call()不会将内容写入文件

时间:2015-05-27 08:44:00

标签: python raspberry-pi subprocess

在Raspberry Pi B +上使用Python 2.7,我想从Python调用命令“raspistill -o image.jpg”并建议使用它:

from subprocress import call
call(["raspistill","-o image.jpg"]) 

但是,这不起作用,因为虽然在Python之外没有创建image.jpg,

raspistill -o

确实创建了该文件。 接下来尝试首先创建图像文件并写入它。

f = open("image.jpg","w")
call(["raspistill","-o image.jpg"], stdout = f)

现在创建了图像文件,但没有写入任何内容:它的大小保持为0.那么我怎样才能使它工作?

谢谢。

3 个答案:

答案 0 :(得分:2)

您将-o image.jpg作为单个参数传递。你应该像两个一样传递它们。方法如下:

call(["raspistill", "-o", "image.jpg"])

你这样做的方式就像从命令行调用raspistill "-o image.jpg",这可能会导致错误。

答案 1 :(得分:2)

首先,您要创建并截断文件image.jpg

f = open("image.jpg","w")

然后你将raspistill的标准输出发送到同一个文件:

call(["raspistill","-o image.jpg"], stdout = f)

当你最终在Python中close处理文件时,现在image.jpg只会保留{stdout}写的raspistill。或者,如果你从来没有close它,它将减去最后一个缓冲区,这可能一点都没有。

与此同时,您还试图让raspistill创建一个具有相同名称的文件,方法是将其作为-o参数的一部分传递。正如Ionut Hulub's answer所解释的那样,你做错了。有些程序会将"-o image.jpg" "-oimage.jpg""-o", "image.jpg"视为同一件事,有些则不会。但是,即使这个确实存在,最多你现在还有两个程序正在争夺创建和编写的文件image.jpg

如果raspistill可以选择将静止写入标准输出,那么您可以使用那个选项,同时传递stdout=f,并确保close } 文件。或者,如果它有一个写入文件名的选项,那么您可以使用那个选项。但是两者都不会起作用。

答案 2 :(得分:1)

如果您不知道如何拆分命令,可以使用shlex.split。例如,

>>> import shlex
>>> args = shlex.split('raspistill -o image.jpg')
>>> args
['raspistill', '-o', 'image.jpg']
>>> call(args)