读取Python中imagemagick子进程的输出[复制]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读取Python中imagemagick子进程的输出[复制]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我想在python中获得文件的平均亮度。阅读了上一个问题[Problem getting terminal output from ImageMagick's compare.exe ( Either by pipe or Python )我想出了:

cmd='/usr/bin/convert {} -format "%[fx:100*image.mean]
" info: >    bright.txt'.format(full)
subprocess.call(cmd,shell=True)
with open('bright.txt', 'r') as myfile:
    x=myfile.read().replace('
', '')
return x

上一个问题建议使用'pythonmagick',我可以找到但没有当前的文档和最近的活动。我无法弄清楚使用它的语法。

我知道我的代码不能令人满意,但确实有效。有没有更好的方法,不需要'shell = true'或额外的文件处理?

答案

您可以改进子流程,并使用Popen + PIPE删除临时文本文件。

cmd=['/usr/bin/convert',
     full,
     '-format',
     '%[fx:100*image.mean]',
     'info:']
pid = subprocess.Popen(cmd,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
out, err = pid.communicate()
return float(out)

ImageMagick还附带identify实用程序。用...可以实现相同的方法

cmd=['/usr/bin/identify', '-format', '%[fx:100*image.mean]', full]

如果值得直接使用ImageMagick的共享库,那么值得探索。通常通过C-API(pythonmagick,wand,&etc)连接。对于您的操作,这只会增加代码复杂性,增加模块依赖性,但绝不会提高性能或准确性。

另一答案

这似乎对我来说可以将均值作为可以打印的变量返回。 (这有点错误。看到底部附近的修正)

#!/opt/local/bin/python3.6

import subprocess

cmd = '/usr/local/bin/convert lena.jpg -format "%[fx:100*mean]" info:'

mean=subprocess.call(cmd, shell=True)
print (mean)

结果是70.67860,返回终端。

如果您解析命令的每个部分,这也适用于shell = False。

#!/opt/local/bin/python3.6

import subprocess

cmd = ['/usr/local/bin/convert','lena.jpg','-format','%[fx:100*mean]','info:']

mean=subprocess.call(cmd, shell=False)
print (mean)

结果是70.67860,返回终端。

来自下面的tripleee的评论表明我的上述过程不正确,因为平均值显示在终端,但实际上没有放入变量。

他建议使用subprocess.check_output()。以下是他的解决方案。 (谢谢你,tripleee)

#!/opt/local/bin/python3.6

import subprocess

filename = 'lena.jpg'
mean=subprocess.check_output(
    ['/usr/local/bin/convert',
     filename,
     '-format',
     'mean=%[fx:100*mean]', 
     'info:'], universal_newlines=True)
print (mean)

印刷品:mean=70.6786

以上是关于读取Python中imagemagick子进程的输出[复制]的主要内容,如果未能解决你的问题,请参考以下文章

Imagemagick / Shell /子进程NodeJS

python遍历目录就是这么简单

python:在线程中读取子进程输出

使用python子进程和ssh读取远程文件?

如何读取子进程标准输出的第一个字节,然后在 Python 中丢弃其余字节?

如何读取子进程标准输出的第一个字节,然后在 Python 中丢弃其余字节?