Python - использование списка в Popen в качестве команды - PullRequest
3 голосов
/ 05 января 2012

Я пытаюсь создать подпроцесс с помощью Popen.Сначала мой код:

hostname = 'host'
servername = 'server'
commandargs = ['/usr/sbin/mminfo',' -o n',' -s',servername,' -q "client=\'',hostname,'\',savetime>=last day"',' -r "client,name"']
process = subprocess.Popen(commandargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Проблема в том, что выполненная команда завершилась ошибкой с сообщением о том, что подключенный сервер недоступен.Кажется, что переменная hostname не используется ... Попытка сделать то же самое со строкой, а не списком, как команда в Popen (с Shell = True) все работает нормально.

Кто-нибудь знает, что такоене так с кодом?

С уважением.Stefan

Ответы [ 2 ]

7 голосов
/ 05 января 2012

В списке каждый аргумент должен быть отдельным элементом. В строках не должно быть пробелов:

commandargs = ['/usr/sbin/mminfo', '-o', 'n', '-s', servername,
               '-q', "client='" + hostname + "',savetime>=last day",
               '-r', 'client,name']
4 голосов
/ 05 января 2012

Каждая строка в данном списке обрабатывается как один аргумент командной строки.Вам также не нужно использовать кавычки при использовании этого синтаксиса.

Попробуйте что-то вроде этого:

hostname = 'host'
servername = 'server'
commandargs = [
    '/usr/sbin/mminfo',
    '-o', 'n', # these are separate arguments, but on the same line for clarity's sake
    '-s', servername, # same here
    '-q', "client='%s',savetime>=last day" % hostname, # same here...
    '-r', 'client,name' # and here.
]
process = subprocess.Popen(commandargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

РЕДАКТИРОВАТЬ: Или, на основе комментариев, что-то вроде

import subprocess

client_name = "lxds05"
server_name = "nsr_srv"

queryspec = "client='%s',savetime>=last day" % client_name
reportspec = "client,name,savetime(17),nsavetime,level,ssflags"

args = [
    '/usr/sbin/mminfo',
    '-o', 'n',
    '-s', server_name,
    '-q', queryspec,
    '-r', reportspec,
    '-x', 'c'
]

subprocess.Popen(args) # ... etc
...