Як використовувати підпроцес 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.