首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python subprocess.call()不会将内容写入文件

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

Stack Overflow用户
提问于 2015-05-27 16:44:00
回答 3查看 1.6K关注 0票数 0

在Raspberry Pi B+上使用Python2.7,我想从Python中调用命令"raspistill -o image.jpg“,并使用以下命令进行查找:

代码语言:javascript
复制
from subprocress import call
call(["raspistill","-o image.jpg"]) 

然而,这不起作用,因为image.jpg不是在Python外部创建的,

代码语言:javascript
复制
raspistill -o

确实创建了文件。下一次尝试是首先创建图像文件并写入。

代码语言:javascript
复制
f = open("image.jpg","w")
call(["raspistill","-o image.jpg"], stdout = f)

现在创建了图像文件,但没有向其中写入任何内容:其大小仍为0。那么我怎么才能让它工作呢?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2015-05-27 16:46:00

您正在将-o image.jpg作为单个参数传递。你应该像两个人一样通过它们。下面是如何实现的:

代码语言:javascript
复制
call(["raspistill", "-o", "image.jpg"])

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

票数 2
EN

Stack Overflow用户

发布于 2015-05-27 16:53:28

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

代码语言:javascript
复制
f = open("image.jpg","w")

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

代码语言:javascript
复制
call(["raspistill","-o image.jpg"], stdout = f)

当您最终使用Python语言对文件进行close-ing时,现在image.jpg将保存raspistill写入标准输出的所有内容。或者,如果你从来不close它,它将是减去最后一个缓冲区,这可能是什么都不是。

同时,您还试图通过将其作为-o参数的一部分进行传递,让raspistill创建一个同名文件。正如Ionut Hulub's answer解释的那样,你这样做是错误的。有些程序会接受"-o image.jpg" "-oimage.jpg",而"-o", "image.jpg"的意思是一样的,但有些程序不会。但是,即使这个程序接受了,你现在也只能让两个程序为创建和写入什么文件而争执不休。

如果raspistill可以选择将静态数据写入标准输出,那么您可以使用该选项,同时传递stdout=f,并确保close文件。或者,如果它有写入文件名的选项,那么您可以使用该选项。但两者兼而有之是行不通的。

票数 2
EN

Stack Overflow用户

发布于 2015-05-27 16:56:18

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

代码语言:javascript
复制
>>> import shlex
>>> args = shlex.split('raspistill -o image.jpg')
>>> args
['raspistill', '-o', 'image.jpg']
>>> call(args)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30477371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档