Мой вопрос более теоретический, чем практический, я нашел больше ответов, объясняющих , как, но не Почему следует использовать список в вызове subprocess.Popen
.Почему мы должны использовать список в subprocess.Popen?
Например, как известно:
Python 2.7.10 (default, Oct 14 2015, 16:09:02)
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> cmd = subprocess.Popen(["python", "-V"], stdout=subprocess.PIPE)
Python 2.7.10
Тогда я бездельничал в UNIX и нашел что-то интересное:
[email protected]:~$ strace -f python -V 2>&1
execve("/usr/bin/python", ["python", "-V"], [/* 29 vars */]) = 0
Возможно как execve
и модель список, subprocess
польза некоторым образом связаны между собой, но может ли кто-нибудь дать хорошее объяснение этому?
Заранее спасибо.
Это удобно, с одной стороны.Когда у вас есть аргумент, который содержит пробел и два разных типа кавычек, требуется довольно немного, чтобы иметь возможность помещать его в строку таким образом, что Bash будет рассматривать ее как один аргумент. Когда он находится в списке, «Popen» позаботится об этом для вас. – zondo
Как в стороне, вы обычно не должны использовать 'subprocess.Popen()' - в некоторых случаях он работает в некоторых случаях на некоторых платформах, но в общем случае он только * запускает * подпроцесс, и вам нужно несколько дополнительных взаимодействий для затем правильно запустить и завершить процесс. Обертки в библиотеке 'subprocess' позаботятся об этом и защищают вас от основных сложностей - только когда они неадекватны для ваших нужд, если вы перейдете к основным функциям рабочей лошади. В этом случае 'subprocess.call()' будет инструментом выбора. – tripleee