Как использовать подпроцесс popen Python

103

Поскольку os.popen заменяется на subprocess.popen, мне было интересно, как бы я преобразовал

os.popen('swfdump /tmp/filename.swf/ -d')

в subprocess.popen ()

Я попытался:

subprocess.Popen("swfdump /tmp/filename.swf -d")
subprocess.Popen("swfdump %s -d" % (filename))  # NOTE: filename is a variable
                                                # containing /tmp/filename.swf

Но, наверное, я неправильно это записываю. Любая помощь будет оценена. Спасибо

Глупый.Жирный.Кошачий
источник
1
Это машина с Windows или Linux?
AAI,

Ответы:

142

subprocess.Popen принимает список аргументов:

from subprocess import Popen, PIPE

process = Popen(['swfdump', '/tmp/filename.swf', '-d'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

Там даже раздел документации , посвященной помогая пользователям мигрировать из os.popenк subprocess.

Блендер
источник
18
@HansThen shell=Trueэто не рекомендуется.
Pierre GM
7
@Lukas Graf Поскольку это сказано в коде. @Alex shell = True считается угрозой безопасности при использовании для обработки ненадежных данных. Умный злоумышленник может изменить ввод для доступа к произвольным системным командам. Например, введя filename.swf; rm -rf /значение имени файла. Однако это проблема только тогда, когда содержимое вашего аргумента Popen небезопасно.
Hans Then
10
@Lukas Graf Из фрагмента кода я сильно сомневаюсь, что это значение было задано в качестве примера, которое должно быть заполнено ненадежными данными, предоставленными пользователем. Но я готов заключить перемирие по этому вопросу. Моя точка зрения заключалась в том, что нет причин не использовать, shell=Trueкроме случаев использования ненадежного ввода. Простое заявление о том, что shell=Trueэто не рекомендуется, вводит в заблуждение.
Hans Then
7
@HansThen: PS Не поймите меня неправильно, я не пытаюсь вмешаться в ваше дело. Просто вам кажется, что вы осведомлены о связанных с этим рисках shell=True, но любой случайный пользователь, наткнувшийся на этот вопрос, может не знать . Вот почему я считаю важным подчеркнуть, что shell=Trueна самом деле это не рекомендуется, если вы точно не знаете, что делаете.
Лукас Граф
4
@Blender Никто не сказал, что это вредно - это просто опасно. Но в остальном ваши аргументы не имеют никакого смысла. Многие функции ОС, которые предоставляет стандартная библиотека Python, потенциально опасны - shutil.rmtreeнапример. Но это не имеет никакого отношения к тому, включены они в stdlib или нет. Я считаю, что философия UNIX: «Unix не создавался для того, чтобы помешать своим пользователям делать глупые вещи, поскольку это также помешало бы им делать умные вещи». также в значительной степени относится к Python.
Лукас Граф
9

Используйте sh , это значительно упростит задачу:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")
амоффат
источник
2
sh, это хорошо, но это не то же самое с Popen подпроцесса. sh похож на вызов подпроцесса.
liuyang1
-1

Использование подпроцесса самым простым способом !!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)
Be Champzz
источник