Операции с файлами, связанные с подпроцессом Python по сравнению с собственным Python - PullRequest
1 голос
/ 17 октября 2019

У меня есть простое задание, которое я хочу выполнить через ssh: вернуть все файлы из заданного списка файлов, которые не существуют.

Я бы хотел сделать следующее:ssh session:

for f in $(files); do stat $f > /dev/null ;done

Перенаправление stdout будет игнорировать все хорошие файлы, а затем чтение stderr даст мне список всех не найденных файлов.

I сначалаподумал об использовании этого кода bash с частью ssh внутри subprocess.run(..., shell=True), но был обескуражен. Вместо этого было предложено paramiko.

Я пытаюсь понять, почему и когда нативный python лучше, чем подпроцессинг bash

  1. Совместимость с различными ОС (для меня это не проблема, поскольку код довольно тесно связан с Ubuntu)
  2. Обработка ошибок и исключений - это то, что я получаю, и думаю, что это важно, хотя перехватывать исключение или код выхода из подпроцесса тоже довольно просто

Недостаток в моих глазах с собственным PythonНужно ли включать несколько сложных модулей, таких как paramiko, когда ssh и stat в bash кажутся мне более простыми и легкими в использовании

Существуют ли какие-либо рекомендации относительно того, когда и как выбирать bash вместо python?

Этот вопрос в основном касается использования команды поверх ssh, но он актуален для любой другой команды, которую bash делает коротким и простым способом, а Python переносит

1 Ответ

1 голос
/ 18 октября 2019

Здесь действительно есть три варианта: сделать что-то в процессе (например, paramiko), запустить ssh напрямую subprocess) и запустить ssh с оболочкой (также с subprocess). Как правило, избегайте программного запуска оболочки (в отличие, скажем, от интерактивного запроса пользователя).

Причина в том, что это ориентированный на человека интерфейс (таким образом, простое разделениеслов с пробелами и ярлыками для $HOME и globbing), который значительно слабоват как API. Рассмотрим, например, как ваш код обнаружит, что ssh отсутствует: ситуация с paramiko не возникает (если установлено , это ), очевидно с subprocess, иэто просто (неоднозначный) код выхода и сообщение stderr из оболочки. Также рассмотрите, как вы предоставляете команду для запуска: это уже должна быть команда, подходящая для оболочки (из-за ограничений в протоколе SSH), но если вы вызываете ssh с оболочкой, это должна быть закодировано (иногда называемое «дважды сбежавший»), чтобы интерпретация локальной оболочки была желаемой многословной командой для удаленной оболочки.

Пока paramiko и subprocessв значительной степени эквивалентны. В качестве более сложного случая рассмотрим, как может проявиться сбой проверки ключа: paramiko будет описывать сбой как data , тогда как другие будут пытаться взаимодействовать с пользователем (что можетили может не присутствовать). paramiko также поддерживает открытие нескольких каналов через одно аутентифицированное соединение;ssh делает то же самое, но только через сложную ControlMaster конфигурацию, включающую файлы сокетов Unix (которые могут не иметь хорошего места для существования в некоторых развертываниях). Говоря о конфигурации, вам может потребоваться передать -F, чтобы избежать осложнений со стороны пользователя .ssh/config, если он не разработан с учетом этого автоматизированного варианта использования.

Таким образом, библиотеки предназначены для вариантов использования, подобных вашему, и поэтому неудивительно, что они работают лучше, особенно для крайних случаев, чем сборка собственного интерфейса из ориентированных на человека команд (хотя очень полезно, чтобы такие ручные композиции были возможными!). Если установка нестандартной зависимости, такой как paramiko, обременительна, при минимум используйте subprocess напрямую;вырезать вторую оболочку - это уже большое улучшение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...