Cómo usar el subproceso popen Python

102

Dado que os.popen está siendo reemplazado por subprocess.popen, me preguntaba cómo convertiría

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

a subprocess.popen ()

Lo intenté:

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

Pero supongo que no estoy escribiendo esto correctamente. Cualquier ayuda sería apreciada. Gracias

Estúpido gato gordo
fuente
1
¿Es esta una máquina con Windows o una máquina con Linux?
AAI

Respuestas:

141

subprocess.Popen toma una lista de argumentos:

from subprocess import Popen, PIPE

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

Incluso hay una sección de la documentación dedicada a ayudar a los usuarios a migrar de os.popena subprocess.

Licuadora
fuente
18
@HansThen shell=Truees no recomendable.
Pierre GM
7
@Lukas Graf Ya que lo dice en el código. @Alex shell = True se considera un riesgo de seguridad cuando se usa para procesar datos que no son de confianza. Un atacante inteligente puede modificar la entrada para acceder a comandos del sistema arbitrarios. Por ejemplo, ingresando filename.swf; rm -rf /el valor del nombre de archivo. Sin embargo, esto es solo un problema cuando el contenido de su argumento para Popen es inseguro.
Hans Then
10
@Lukas Graf Del fragmento de código, dudo mucho que se pretendiera como un valor de ejemplo, para ser llenado con datos no confiables proporcionados por el usuario. Pero estoy dispuesto a pedir una tregua sobre ese tema. Mi punto fue más que no hay razón para no usar, shell=Trueexcepto cuando se usa una entrada que no es de confianza . Simplemente decir que shell=Trueno se recomienda es engañoso.
Hans Then
7
@HansThen: PD: No me malinterpretes, no estoy tratando de entrar en tu caso aquí. Es solo que parece ser consciente de los riesgos involucrados shell=True, pero cualquier usuario aleatorio que se encuentre con esta pregunta podría no serlo. Por eso creo que es importante destacar que shell=Truede hecho no se recomienda, a menos que sepas exactamente lo que estás haciendo.
Lukas Graf
4
@Blender Nadie dijo que fuera dañino, es simplemente peligroso. Pero aparte de eso, su argumento no tiene ningún sentido. Muchas funciones del sistema operativo que expone la biblioteca estándar de Python son potencialmente peligrosas, shutil.rmtreepor ejemplo. Pero eso no tiene nada que ver con si están incluidos en stdlib o no. Creo que la filosofía de UNIX de "Unix no fue diseñada para evitar que sus usuarios hagan cosas estúpidas, ya que eso también les impediría hacer cosas inteligentes". también se aplica en gran parte a Python.
Lukas Graf
9

Usa sh , te facilitará mucho las cosas:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")
amoffat
fuente
2
sh, es bueno, sin embargo, no es lo mismo con Popen del subproceso. sh es similar a la llamada de subproceso.
liuyang1
-1

¡Usando Subprocess de la manera más fácil!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)
Ser Champzz
fuente