2016-10-27 2 views
1

У меня есть сценарий питона, на котором выполняется команда Линукс, чтобы проверить, если файл существует:Popen failed, если команда является списком и содержит '&&' или '||'

>>> p = subprocess.Popen([ 'sudo', 'test', '-f', '/root/some_file', '&&', 'echo', 'True', '||', 'echo', 'False' ]) 

Он производит ошибку:

>>> test: extra argument `&&' 

Если передать команду в один, то он выполняется успешно:

>>> p = subprocess.Popen('sudo test -f /root/some_file && echo True || echo False' ], shell=True) 
>>> True 

Почему это происходит, если команда pass в качестве списка?

Мне нужно использовать как & &, так и || чтобы проверить, если файл в корень в существование, так что я не могу преобразовать его в цепочку отдельных команд, как предложено here

+3

дубликата http://stackoverflow.com/questions/15467237/using-in -subprocess-popen-for-command-chaining? –

+0

Да, это похоже. Но мой главный концерт - использовать как &&, так и || чтобы проверить, существует ли файл root, поэтому я не могу преобразовать его в цепочку отдельных команд. –

ответ

2

Согласно этому ответу: Python: subprocess call with shell=False not working

При вызове POPEN с оболочкой = True, вы должны использовать строку , При вызове Popen с shell = False вы должны использовать список.

Использование '& &' и '||' будет работать, только если вы используете shell = True, поскольку они требуют оболочки. Это означает, что вы можете заставить это работать, используя строку в качестве вашей команды, а не список.

Если вы получаете вашу команду в списке, то вы можете просто сделать что-то вроде:

" ".join(cmd_list) 

https://docs.python.org/2/library/subprocess.html#frequently-used-arguments

+0

Нет, на самом деле это не так. Он выводит smt-сообщение как сообщение помощи: '>>> use: sudo [-D level] -h | -K | -k | -В ' –

+0

Вы правы, я просто попробовал. Я посмотрю, смогу ли я понять, что здесь происходит ... –

+0

Я обновил ответ сейчас –

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