2009-09-10 3 views
1

Просто то, что название говорит:Создайте исполняемый процесс без использования оболочки на Python 2.5 и ниже

  1. Модуль subprocess не может быть использован как это должно работать на 2,4 и 2,5
  2. процесс Shell не должен быть порождал передать аргументы.

Для объяснения (2), рассмотрим следующий код:

>>> x=os.system('foo arg') 
sh: foo: not found 
>>> x=os.popen('foo arg') 
sh: foo: not found 
>>> 

Как вы можете видеть os.system и os.popen запускает указанную команду ("Foo") через системную оболочку ("ш"). Я не хочу, чтобы это произошло (иначе, уродливые «не найдены» сообщения печатаются в программу stderr без моего контроля).

Наконец, я должен был бы передать аргументы этой программе ('arg' в приведенном выше примере).

Как бы это сделать в Python 2.5 и 2.4?

ответ

3

Вы, вероятно, необходимо использовать модуль подпроцесс, который доступен в 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#replacing-os-system

В качестве альтернативы вы можете также передать subprocess.PIPE в потоки вывода для подавления сообщений. См. Ссылку выше для получения более подробной информации.

+0

Err, подпроцесс доступен от 2.4? Я заблуждался, думая, что он доступен с 2.6. –

+0

В руководстве написано «новое в 2.4», – Unknown

0

Как описано выше, вы можете (и должны) использовать модуль subprocess.

По умолчанию 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) 
Смежные вопросы