应使用子流程.如果可能的话,避免Popen和subprocess.call?



我正在做一个项目,通过使用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 预处理器

同样,你真的没有理由证明转换是合理的。至少今天不是。

最新更新