Jak używać podprocesu popen Python

Ponieważ {[2] } jest zastępowane przez subprocess.popen, zastanawiałem się, jak przekonwertować

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

Do 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 chyba źle to wypisuję. Każda pomoc będzie mile widziana. Dzięki
Author: Neuron, 2012-09-26

5 answers

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()

Istnieje nawet sekcja dokumentacji poświęcona pomocy użytkownikom w migracji z os.popen do subprocess.

 151
Author: Blender,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-11 17:12:52

Użyj sh , to znacznie ułatwi sprawę:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")
 9
Author: amoffat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-27 04:14:44

W najnowszej wersji Pythona, subprocess ma dużą zmianę. Oferuje zupełnie nową klasę {[4] } do obsługi os.popen1|2|3|4.

NOWY subprocess.Popen()

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

Jego argumenty:

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)

Mówiąc najprościej, Nowy Popen zawiera wszystkie funkcje, które zostały podzielone na 4 oddzielne stare popen.

Stary popen:

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

Możesz uzyskać więcej informacji w Stack Abuse-Robert Robinson. Podziękuj Mu za oddanie.

 1
Author: Mai Hai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-31 12:03:53

Może nie być oczywiste, jak podzielić polecenie powłoki na sekwencję argumentów, szczególnie w złożonych przypadkach. shlex.split() może wykonać poprawną tokenizację dla args (używam przykładu wywołania blendera):

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

 0
Author: efimp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-02-05 17:19:56

Używanie Podprocesu w najprostszy sposób!!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)
 -3
Author: Be Champzz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-06 03:00:12