2012-01-05 2 views
2

Я пытаюсь создать подпроцесс с Popen. Вот мой код на первый:Python - используя список в Popen as command

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) 

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

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

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

+0

Не указывайте имя хоста, нет необходимости. Допустимые имена хостов не имеют никаких символов, которые могут расширяться до чего-то странного, и у них нет пробелов. Другая вещь, которую вы должны сделать, состоит в том, чтобы каждый объект в команде разделялся, не делал «-o n», а вместо этого «-o», «n» и т. Д. – synthesizerpatel

+0

имя хоста = 'host' Вы имеете в виду это^? Это мой тест на заполнение переменной тестовым именем хоста. – StefanS

ответ

3

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

попробовать что-то вроде этого:

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) 

EDIT: Или, основываясь на комментариях, что-то вроде

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 
+0

commandargs = [ '/ usr/sbin/mminfo', '-o', 'n', '-s', servername, '-q', '"client =' ', hostname,' \ ' , savetime> = last ',' ',' day '', '-r', '' клиент, имя, savetime (17), nsavetime, level, ssflags "', ' -x ',' 'c; "', ' | sed ','" 1d "'] – StefanS

+0

Использование конвейера не будет работать без аргумента' shell', но если вы используете 'sed' для удаления строки, вы можете так же хорошо сделайте это и в Python. – AKX

+0

Извините за мои вставки, :-(, я попытался помещать отредактированный список здесь. – StefanS

6

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

commandargs = ['/usr/sbin/mminfo', '-o', 'n', '-s', servername, 
       '-q', "client='" + hostname + "',savetime>=last day", 
       '-r', 'client,name'] 
+0

спасибо, что работает нормально. Только «последний день» имеет пробел. Есть ли для этого особый характер? – StefanS

+1

@StefanS Нет, точка списка - это точно, чтобы подпроцесс выполнял все экранирование. – phihag

+0

Хорошо, а что с персонажем вроде ', мне нужно его избежать? – StefanS

Смежные вопросы