Як використовувати підпроцес popen Python


102

Оскільки 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

Відповіді:


141

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це НЕ рекомендується.
П'єр ГМ

7
@Lukas Graf Оскільки це написано в коді. @Alex shell = True вважається ризиком для безпеки при обробці ненадійних даних. Розумний зловмисник може змінити вхід для доступу до довільних команд системи. Наприклад, ввівши filename.swf; rm -rf /значення імені файлу. Однак це лише проблема, коли вміст вашого аргументу щодо Попена небезпечний.
Тоді Ганс,

10
@Lukas Graf З фрагмента коду я сильно сумніваюся, що малося на увазі як приклад значення, яке заповнюватиметься недовіреними користувачами даними. Але я готовий закликати до перемир'я по цьому пункту. Моя думка полягала в тому, що немає ніяких причин не використовуватись, shell=Trueкрім випадків, коли використовується ненадійний ввід. Просто зазначити, що shell=Trueне рекомендується, вводить в оману.
Тоді Ганс,

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 подібний з викликом підпроцесу.
liuyang1

-1

Використання підпроцесу найпростішим способом !!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.