如果可能,应该避免使用subprocess.Popen和subprocess.call吗?

时间:2018-10-25 16:55:38

标签: python python-3.x subprocess imagemagick wand

我正在做一个通过使用ImageMagick

进行简单图像处理和比较的项目。

现在,要执行命令,我正在使用python subprocess模块,如下所示:

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之类的子流程相比,我认为子流程的调用更具可读性/简单性,但是如果我想切换还有其他好处。

1 个答案:

答案 0 :(得分:2)

  

是否应尽可能避免使用subprocess.Popen和subprocess.call?

不值得。您共享的代码是直接任务,您已经在python中以清晰易读的方式进行了模板化。为什么要将一项快速任务的解决方案复杂化,使其具有更多的依赖性和复杂性。 convert实用程序今天也为您工作,但明天可能会有另一个外部实用程序。

  

重构代码以在性能,安全性等方面不使用子流程模块是否有很大的好处?

我认为这是通过不调用系统调用而对性能的最小好处,但是包括一个动态加载共享库的C-API包装器模块也差不多。另外,根据委托,ImageMagick本身可能会调用系统调用。

为了安全起见,无论哪种方式,您的应用程序仍然负责清理变量。我也建议...

  • 通过IM阅读Security Policies
  • 确保subprocess.call不能被外部资源访问。 (即,如果解决方案在Web服务器上,则将任务移至远程队列工作器)
  • 改善错误和警告处理。那比你想的更普遍!

切换参数

我能想到的常见理由...

  • 减少I / O,因为图像数据已经在python内存中。
  • 任务是基于算法(例如模因生成器)动态的。
  • 常见像素迭代器
  • OCR / CV预处理器

同样,您确实没有论据证明切换是合理的。至少今天没有。