Создайте исполняемый процесс без использования оболочки на Python 2.5 и ниже
-
05-07-2019 - |
Вопрос
Только то, что написано в названии:
<Ол> subprocess
нельзя использовать, так как он должен работать на 2.4 и 2.5 Чтобы объяснить (2), рассмотрим следующий код:
>>> x=os.system('foo arg')
sh: foo: not found
>>> x=os.popen('foo arg')
sh: foo: not found
>>>
Как вы можете видеть, os.system
и os.popen
запускают данную команду (" foo ") через системную оболочку (" sh "). Я не хочу, чтобы это происходило (в противном случае безобразные «не найденные» сообщения печатаются в программе stderr без моего контроля).
Наконец, я должен быть в состоянии передать аргументы этой программе ('arg' в приведенном выше примере). Р>
Как можно поступить так в Python 2.5 и 2.4?
Решение
Возможно, вам нужно использовать модуль подпроцесса, который доступен в Python 2.4
Popen("/home/user/foo" + " arg")
>>> Popen("foo arg", shell=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/subprocess.py", line 595, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1092, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Вам нужно будет указать полный путь, поскольку вы не используете оболочку.
http://docs.python.org/library/subprocess .html # замена-OS-система р>
В качестве альтернативы вы также можете передать subprocess.PIPE в stderr и stdout для подавления сообщений. См. Ссылку выше для получения дополнительной информации.
Другие советы
Как описано выше, вы можете (и должны) использовать модуль подпроцесс . р>
По умолчанию параметр shell
имеет значение False
. Это хорошо и вполне безопасно. Кроме того, вам не нужно передавать полный путь, просто передайте имя исполняемого файла и аргументы в виде последовательности (кортеж или список).
import subprocess
# This works fine
p = subprocess.Popen(["echo","2"])
# These will raise OSError exception:
p = subprocess.Popen("echo 2")
p = subprocess.Popen(["echo 2"])
p = subprocess.Popen(["echa", "2"])
Вы также можете использовать эти две вспомогательные функции, уже определенные в модуле подпроцесса:
# Their arguments are the same as the Popen constructor
retcode = subprocess.call(["echo", "2"])
subprocess.check_call(["echo", "2"])
Помните, что вы можете перенаправить stdout
и / или stderr
в PIPE
, и, таким образом, он не будет выведен на экран (но вывод все еще доступен для чтения вашей программой на python). По умолчанию stdout
и stderr
имеют значение None
, что означает no redirection , что означает, что они будут использовать одно и то же. stdout / stderr в качестве вашей программы на Python.
Кроме того, вы можете использовать shell = True
и перенаправить stdout
. stderr
в ТРУБУ, поэтому сообщение не будет напечатано: р>
# This will work fine, but no output will be printed
p = subprocess.Popen("echo 2", shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# This will NOT raise an exception, and the shell error message is redirected to PIPE
p = subprocess.Popen("echa 2", shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)