2017-02-09 1 views
0

Я создаю программу python, которая вызывает ряд других программ и скриптов (в Unix (SUNos) + Linux). Я использую подпроцесс везде, кроме 1 скрипта.Выполнение команды w/quotes in parameters работает с командами command.getoutput(), но не подпроцессом

Сценарий, для которого я не использую подпроцесс, представляет собой Perl-скрипт, который был превращен в исполняемый файл. Как-то это не позволяет мне использовать подпроцесс, но он работает с пакетом (устаревшим) команд. Я хотел бы понять, почему он не работает с подпроцессом (другими словами: что я делаю неправильно ;-))

(Что действительно важная команда perl не имеет значения, но она возвращает полное имя и адрес электронной почты пользователь как результат)

Что я пробовал:

PERL_CMD = [ '<executable perl-script>', '-rt', '"users"', '-eq', '"name"' '"<user_name>", '-fs', '":"', '-fld', '"fullname"', '"email"' ] 
full_name, email = subprocess.check_output(PERL_CMD).split(':') 

Но это не работает.

Где вариант команды делает работу:

PERL_CMD = '<executable perl-script> -rt "users" -eq "name" "<user_name>" -fs ":" -fld "full_name" "email"' 
full_name, email = commands.getoutput(PERL_CMD).split(':') 

Кто-нибудь идея, почему я не могу получить подпроцесс работать?

Меня раздражает, что я могу заставить его работать на все, кроме этого (хотя у меня есть приемлемое (но устаревшее) обходное решение).

+0

Что делает «Но это не работает». работа означает? Вы получаете исключение? Если да, то какой? –

+0

@Mike: Я давно запускал версию подпроцесса, поэтому больше не знаю точное исключение, но оно дало исключение. Ответ, данный Чарльзом Даффи ниже, объясняет мне, почему это происходит неправильно, поэтому я теперь знаю причину. Thanx в любом случае для ответа – Nemelis

ответ

1

Вы используете синтаксические котировки в футляре commands.getoutput() и буквенные котировки в футляре subprocess.check_output(). Без shell=True (который вы не должны использовать), нет синтаксиса для синтаксиса синтаксиса, поэтому синтаксическая цитата отсутствует, кроме цитат, которые являются синтаксисом , самому Python.

Так, просто вынимают " сек, что вы вводили в ваши аргументы:

# this contains quotes that are syntactic to Python only, and no literal quotes 
perl_cmd = [ 
    '<executable perl-script>', 
    '-rt', 'users', 
    '-eq', 'name', '<user_name>', 
    '-fs', ':', 
    '-fld', 'fullname', 'email' ] 

Чтобы объяснить немного больше деталей -

Когда вы передаете "name" к оболочке как часть команды, кавычки , потребляемые самой оболочкой во время его разбора, не передаются команде в качестве аргумента. Таким образом, когда вы запускаете sh -c 'echo "hello"', это передает точно такой же аргумент - echo как sh -c 'echo hello'; команда echo не может даже сказать разницу между двумя вызовами!

При передаче '"hello"' в качестве аргумента subprocess.Popen(), напротив, внешние кавычки потребляются Python, и внутренние кавычки передается как литерал внутренней команды. Это делает его эквивалентным sh -c 'echo "\"hello\""' (который также передает литеральные котировки до echo), а не sh -c 'echo "hello"' (а это не так).

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