2011-08-11 3 views
1

У меня есть куча кода, который использует старый устаревший popen из пакета platform. Поскольку это устарело, я буду перемещать это в пакет subprocess.Портирование с платформы.popen на subprocess.Popen?

Что такое эквивалентный оператор для popen("some_command")? Есть ли причина, по которой popen устарел?

+0

это просто. Прочтите [документация] (http://docs.python.org/library/subprocess.html) – JBernardo

+0

В документации объясняется, как она заменяет os.popen, а не platform.popen. Регулярным утверждением является просто «platform.popen (« python some_script.py »)» – coffee

+1

делает ли это * any * difference? – JBernardo

ответ

0
  • platform.popen не был устаревшим, насколько я могу судить. Тем не менее, это низкоуровневая функция, которую вы не должны использовать для удобства и мобильности.

  • Многие вещи, запускающие процесс, были устаревшими, а некоторые удалены на Python 3. Многие попытки сделать это хорошо были сделаны в истории Python, а subprocess.Popen и его удобные функции на сегодняшний день являются лучшими. После его существования другие стали крутыми, и большинство из них остались там, чтобы поддержать устаревший код.

  • Если вы собираетесь в порт код, чтобы использовать subprocess модуль, не искать точный эквивалент того, что вы делаете, или вы пропустите на пути, в которых он лучше , Прочтите и поймите документацию subprocess и поймите идеи, которые она использует, чтобы решить проблему запуска процесса лучше, чем старые альтернативы.

    Как subprocess.Popen лучше, чем у старых альтернатив?

    • Это безопасно. Вместо something('shell command here'), делаем Popen(['shell', 'command', 'here']). Это не запускает ненужный процесс оболочки, что делает его менее ошибочным и опасным.

      Рассмотрите, если я попрошу пользователя ввести их имя. Я мог бы написать something('foo %s" % name) в старой вещи. Он должен работать - если пользователь дает вам имя «Mike», тогда он становится командой вроде foo Mike. Но что, если имя пользователя «Майк Грэхем»? Тогда я хочу foo 'Mike Graham'. Итак, теперь я всегда ставил апострофы, но теперь, если имя пользователя "Mike O'Reilley"? Хуже того, что, если его зовут "Mike; rm -rf /"? Решение здесь заключается не в том, чтобы попытаться избежать их самих (что трудно сделать правильно, не говоря уже о кросс-платформенном), но передать аргументы напрямую, не беспокоясь о оболочке - Popen(['foo', name]) `.

    • Гибкость. Вы можете полностью контролировать вход и выход.

    • Неблокируется.Popen может запускать процесс одновременно с вашим.

Смежные вопросы