在Python中读取imagemagick子进程的输出

时间:2018-09-17 16:54:21

标签: python subprocess imagemagick

我想获取python中文件的平均亮度。阅读上一个问题[enter image description here之后,我想到了:

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

上一个问题建议使用“ pythonmagick”,我可以找到它,但没有最新文档,最近的活动很少。我无法弄清楚使用它的语法。

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

2 个答案:

答案 0 :(得分:0)

您可能可以改善子流程,并使用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,魔杖等)连接。对于您所做的事情,这只会增加代码复杂性,增加模块依赖性,而绝不会提高性能或准确性。

答案 1 :(得分:0)

这似乎对我有用,将均值作为可以打印的变量返回。 (这是一个错误。请参阅底部的更正)

public void SomeMethod(ref int parameter)
{
   parameter++;
}


结果是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=True)
print (mean)


结果是70.67860,这将返回到终端。

下面#!/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) 中的注释表明,我的上述处理方法不正确,因为平均值在终端显示,但实际上并未放入变量中。

他建议使用tripleee。以下是他的解决方案。 (谢谢,三胞胎)

subprocess.check_output()

打印:#!/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)