在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.那么我怎样才能使它工作?
谢谢。
答案 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)