Следует ли по возможности избегать использования subprocess.Popen и subprocess.call? - PullRequest
0 голосов
/ 25 октября 2018

Я делаю проект, выполняющий простую обработку изображений и сравнение с использованием 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)

Я недавно узнал, что есть обертки Python для ImageMagick.В частности, я изучал MagickWand.

Есть ли большое преимущество в рефакторинге моего кода, чтобы не использовать модуль подпроцесса с точки зрения производительности, безопасности и т. Д.

Я думаю, чтовызов подпроцесса более читабелен / прост, чем если бы я использовал что-то вроде MagickWand, но если есть другие преимущества, я хочу переключиться.

1 Ответ

0 голосов
/ 02 ноября 2018

Следует ли по возможности избегать использования subprocess.Popen и subprocess.call?

Не стоит.Код, которым вы поделились, - прямая задача, которую вы уже создали в python понятным и понятным способом.Зачем усложнять ваше решение дополнительными зависимостями и сложностью для одной быстрой задачи.Также утилита convert работает для вас сегодня, но завтра может появиться другая внешняя утилита.

Есть ли большое преимущество в рефакторинге моего кода, чтобы не использовать модуль подпроцесса с точки зрения производительности, безопасности,и т. д.

Я бы сказал, что это только наименьшее преимущество для производительности, если НЕ вызывать системный вызов, но включение модуля-оболочки C-API, который динамически загружает разделяемые библиотеки, также будет примерно таким же.Кроме того, в зависимости от делегаций, возможно, что сам ImageMagick будет вызывать системный вызов.

В целях безопасности ваше приложение по-прежнему отвечает за очистку переменных.Я также хотел бы предложить ...

  • Чтение на Политики безопасности с IM
  • Убедитесь, что subprocess.call не может быть доступ из внешних ресурсов.(т. е. если решение находится на веб-сервере, перенесите задачи на удаленного работника очереди)
  • Улучшение обработки ошибок и предупреждений.Они встречаются чаще, чем вы думаете!

Аргументы ЗА переключение

Общие обоснования, которые я могу придумать ...

  • Сокращение ввода-вывода, поскольку данные изображения уже находятся в памяти Python.
  • Задачи являются динамическими на основе алгоритма (например, генераторы мемов).
  • Обычные итераторы пикселей
  • Препроцессоры OCR / CV

Опять же, у вас действительно нет аргументов для оправдания переключения.По крайней мере, не сегодня.

...