Hoe subproces popen Python te gebruiken

Sinds os.popenwordt vervangen door subprocess.Popen, vroeg ik me af hoe ik zou converteren

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

naar subprocess.Popen()

Ik heb het geprobeerd:

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

Maar ik denk dat ik dit niet goed opschrijf. Alle hulp zou op prijs worden gesteld. Bedankt


Antwoord 1, autoriteit 100%

subprocess.Popenneemt een lijst met argumenten:

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

Er is zelfs een sectie van de documentatiegewijd aan het helpen van gebruikers bij het migreren van os.popennaar subprocess.


Antwoord 2, autoriteit 7%

Gebruik sh, dat maakt het een stuk makkelijker:

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

Antwoord 3, autoriteit 3%

In de recente Python-versie heeft subprocesseen grote verandering ondergaan. Het biedt een gloednieuwe klasse Popenom os.popen1|2|3|4te verwerken.

Het nieuwe subprocess.Popen()

import subprocess
subprocess.Popen('ls -la', shell=True)

zijn argumenten:

subprocess.Popen(args, 
                bufsize=0, 
                executable=None, 
                stdin=None, stdout=None, stderr=None, 
                preexec_fn=None, close_fds=False, 
                shell=False, 
                cwd=None, env=None, 
                universal_newlines=False, 
                startupinfo=None, 
                creationflags=0)

Simpel gezegd, de nieuwe Popenbevat alle functies die zijn opgesplitst in 4 afzonderlijke oude Popen.

De oude Popen:

Method  Arguments
popen   stdout
popen2  stdin, stdout
popen3  stdin, stdout, stderr
popen4  stdin, stdout and stderr

U kunt meer informatie krijgen in stapel misbruik – Robert Robinson . Bedank hem voor zijn toewijding.


Antwoord 4, Autoriteit 2%

Het is misschien niet duidelijk hoe een schaalopdracht in een reeks argumenten moet breken, vooral in complexe gevallen. shlex.split()kan de juiste tokenizatie voor args uitvoeren (ik gebruik het voorbeeld van Blender van de oproep):

import shlex
from subprocess import Popen, PIPE
command = shlex.split('swfdump /tmp/filename.swf/ -d')
process = Popen(command, stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

https://docs.python.org/3/library/subprocess.html


Antwoord 5

Subprocess gebruiken op het gemakkelijkste manier !!

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

Other episodes