我正在做一个项目,通过使用ImageMagick
进行简单的图像处理和比较
现在,为了执行我的命令,我正在使用pythonsubprocess
模块:
color_space = ...
evaluate_sequence = ...
output_file_name = ...
convert_cmd = ["magick", "convert", "-colorspace", color_space.name] + queue +
["-evaluate-sequence", evaluate_sequence.name, output_file_name]
subprocess.call(convert_cmd)
我最近了解到有用于ImageMagick
的 Python 包装器。特别是,我正在研究MagickWand
.
重构我的代码以在性能、安全性等方面不使用子流程模块是否有很大的好处?
我认为子进程调用比我使用类似MagickWand
的东西更具可读性/简单性,但如果还有其他好处,我想切换。
应该使用子进程。如果可能的话,避免Popen和subprocess.call?
不值得。您共享的代码是您在python中以清晰易读的方式模板化的直接任务。为什么要使解决方案复杂化,因为单个快速任务具有额外的依赖项和复杂性。此外convert
实用程序今天适合您,但明天可能会有另一个外部实用程序。
重构我的代码以在性能、安全性等方面不使用子流程模块是否有很大的好处?
我认为,通过不调用系统调用,这只是对性能的最小好处,但包括动态加载共享库的 C-API 包装器模块也大致相同。另外,根据委托的不同,ImageMagick 本身可能会调用系统调用。
为了安全起见,无论哪种方式,您的应用程序仍负责清理变量。我还建议...
- 阅读使用 IM 的安全策略
- 确保外部资源无法访问
subprocess.call
。(即,如果解决方案在 Web 服务器上,请将任务移动到远程队列工作线程( - 改进错误和警告处理。它们比你想象的更常见!
切换参数
我能想到的常见理由...
- 减少 I/O,因为图像数据已经在 python 内存中。 任务
- 是基于算法(如模因生成器(的动态任务。
- 常见像素迭代器
- OCR/CV 预处理器
同样,你真的没有理由证明转换是合理的。至少今天不是。