Come usare il sottoprocesso popen Python


102

Poiché os.popen è stato sostituito da subprocess.popen, mi chiedevo come avrei convertito

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

a subprocess.popen ()

Provai:

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

Ma immagino di non scriverlo correttamente. Qualsiasi aiuto sarebbe apprezzato. Grazie


1
È una macchina Windows o Linux?
AAI

Risposte:


141

subprocess.Popen accetta un elenco di argomenti:

from subprocess import Popen, PIPE

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

C'è anche una sezione della documentazione dedicata ad aiutare gli utenti a migrare da os.popena subprocess.


18
@HansThen nonshell=True è raccomandato.
Pierre GM

7
@Lukas Graf Dal momento che lo dice nel codice. @Alex shell = True è considerato un rischio per la sicurezza quando viene utilizzato per elaborare dati non attendibili. Un malintenzionato intelligente può modificare l'input per accedere a comandi di sistema arbitrari. Ad esempio inserendo filename.swf; rm -rf /il valore del nome del file. Tuttavia, questo è solo un problema, quando il contenuto della tua argomentazione a Popen è insicuro.
Hans Then,

10
@Lukas Graf Dal frammento di codice dubito fortemente che sia stato inteso come un valore di esempio, da riempire con dati forniti da utenti non attendibili. Ma sono pronto a chiedere una tregua su questo punto. Il mio punto era più che non c'è motivo per non usarlo shell=Truetranne quando si utilizza un input non attendibile . Affermare semplicemente che shell=Truenon è raccomandato è fuorviante.
Hans Then,

7
@ HansThen: PS Non fraintendermi, non sto cercando di occuparmi del tuo caso qui. È solo che sembri essere consapevole dei rischi connessi shell=True, ma qualsiasi utente casuale che si imbatte in questa domanda potrebbe non esserlo. Ecco perché penso che sia importante sottolineare che shell=Truein realtà non è raccomandato, a meno che tu non sappia esattamente cosa stai facendo.
Lukas Graf

4
@Blender Nessuno ha detto che fosse dannoso - è semplicemente pericoloso. Ma a parte questo, la tua argomentazione non ha affatto senso. Molte funzioni del sistema operativo che la libreria standard Python espone sono potenzialmente pericolose, prendiamo shutil.rmtreead esempio. Ma questo non ha nulla a che fare con il fatto che siano inclusi o meno nello stdlib. Credo che la filosofia UNIX di "Unix non sia stata progettata per impedire ai suoi utenti di fare cose stupide, in quanto ciò impedirebbe loro anche di fare cose intelligenti". si applica anche in gran parte a Python.
Lukas Graf

9

Usa sh , renderà le cose molto più facili:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")

2
sh, va bene, tuttavia non è lo stesso con Popen di subprocess. sh è simile a call of subprocess.
liuyang1

-1

Usare Subprocess nel modo più semplice !!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.