2015-03-29 2 views
0

Я пытаюсь получить некоторые зависимости на pacman, автоматизированном с помощью python. То, что я хочу выпустить в оболочке (и получить вывод) является:python: аргументы подпроцесса разделяют строки неправильно

pacman -Si [a_package] | grep Conflicts | awk -F: '{print $2}' 

Так что это мой питон код:

getconflicts1 = "pacman -Si" 
getconflicts2 = "| grep Conflicts | awk -F: '{print $2}'" 
pkgs = # an example package list 
for x in range (1,2): 
    getconflicts = getconflicts1 + pkgs[x] + getconflicts2 
    process2 = subprocess.Popen(getconflicts.split(), stdout=subprocess.PIPE) 
    conflicts = process2.communicate()[0] 
    print(conflicts) 

Однако pacman говорит «неверный вариант - F», когда я используйте программу python, тогда как сама команда в командной строке работает.

Это:

print(getconflicts.split()) 

дает мне:

['pacman', '-Si', 'frameworkintegration', '|', 'grep', 'Conflicts', '|', 'awk', '-F:', "'{print", "$2}'"] 

Я своего рода новичок в Python и подпроцессов в питона еще больше, так что у вас есть намек на то, как сделать это правильно?

+0

связанный: [Как использовать subprocess.Popen для подключения нескольких процессов по трубам?] (Http://stackoverflow.com/q/295459/4279) – jfs

+0

не ставьте решение в вопрос, размещайте его как ответ вместо этого. – jfs

+0

Вопрос уже был дан, но я добавил решение вопроса, так как, по моему опыту, очень полезно иметь его и в сообщении. – larkey

ответ

2

Я думаю, что я столкнулся с этим раньше, где, если вы не используете shell = True, вы не можете использовать там трубы. Я думаю, причина в том, что подпроцесс не использует оболочку для запуска вашей команды, если вы не сообщите об этом, так что | просто передается в качестве другого аргумента в исполняемый файл, который вы вызываете.

+0

Это, по крайней мере, избавляет от первоначальной ошибки, но теперь pacman говорит: «ошибка: никакой операции не указана ...», хотя операция «-Si» включена в «getconflicts.split()» – larkey

+0

Какое изменение вы фактически сделали получить это? Если вы изменили использование shell = True, вам больше не нужно делиться, он принимает команду как строку и передает ее в оболочку для обработки. –

+0

О, ничего себе, это круто! Благодаря! – larkey

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