Jak używać podprocesu popen Python

103

Ponieważ os.popen jest zastępowane przez subprocess.popen, zastanawiałem się, jak skonwertować

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

to subprocess.popen ()

Próbowałem:

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

Ale myślę, że nie piszę tego poprawnie. Każda pomoc będzie mile widziana. Dzięki

Stupid.Fat.Cat
źródło
1
Czy to jest maszyna z systemem Windows czy Linux?
AAI

Odpowiedzi:

142

subprocess.Popen pobiera listę argumentów:

from subprocess import Popen, PIPE

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

Jest nawet sekcja dokumentacji poświęcona pomocy użytkownikom w migracji z os.popendo subprocess.

Mikser
źródło
18
@HansThen nieshell=True jest zalecane.
Pierre GM
7
@Lukas Graf Ponieważ tak jest napisane w kodzie. @Alex shell = True jest uważana za zagrożenie bezpieczeństwa, gdy jest używana do przetwarzania niezaufanych danych. Sprytny napastnik może zmodyfikować dane wejściowe, aby uzyskać dostęp do dowolnych poleceń systemowych. Np. Wprowadzając filename.swf; rm -rf /wartość nazwy pliku. Jest to jednak problem tylko wtedy, gdy treść argumentu do Popena jest niepewna.
Hans Potem
10
@Lukas Graf Z fragmentu kodu mocno wątpię, aby była to przykładowa wartość, którą należy wypełnić niezaufanymi danymi dostarczonymi przez użytkownika. Ale jestem gotów zawrzeć rozejm w tej sprawie. Chodziło mi bardziej o to, że nie ma powodu, aby nie używać, shell=Truez wyjątkiem korzystania z niezaufanych danych wejściowych. Samo stwierdzenie, że shell=Truenie jest to zalecane, jest mylące.
Hans Then
7
@HansThen: PS Nie zrozum mnie źle, nie próbuję się tutaj wtrącać. Po prostu wydaje się, że zdajesz sobie sprawę z związanego z tym ryzyka shell=True, ale każdy przypadkowy użytkownik, który natknie się na to pytanie, może nie być. Dlatego uważam, że ważne jest, aby podkreślić, że shell=Truew rzeczywistości nie jest to zalecane, chyba że dokładnie wiesz, co robisz.
Lukas Graf,
4
@Blender Nikt nie powiedział, że to szkodliwe - jest po prostu niebezpieczne. Ale poza tym twój argument w ogóle nie ma sensu. Wiele funkcji systemu operacyjnego, które ujawnia standardowa biblioteka Pythona, jest potencjalnie niebezpiecznych - shutil.rmtreena przykład. Ale to nie ma nic wspólnego z tym, czy są one zawarte w standardowej bibliotece, czy nie. Uważam, że filozofia Uniksa „Uniksa nie została zaprojektowana, aby powstrzymać użytkowników przed robieniem głupich rzeczy, ponieważ powstrzymałoby to ich również przed robieniem sprytnych rzeczy”. ma również zastosowanie w dużych częściach do Pythona.
Lukas Graf,
9

Użyj sh , to znacznie ułatwi:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")
amoffat
źródło
2
sh, to dobrze, ale to nie to samo z Popenem z podprocesu. sh jest podobne do wywołania podprocesu.
liuyang1
-1

Korzystanie z Subprocess w najprostszy sposób !!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)
Bądź Champzzem
źródło