2016-03-11 2 views
1

Я пытаюсь запустить команду оболочки из python, но как только я добавлю трубку, я получаю сообщение об ошибке «Ошибка OSError: [Errno 2] No such file or directory». Я пробовал разные вещи и даже ссылался на grep непосредственно в/bin/grep. Любая идея, что я делаю неправильно?Команды оболочки с трубой в Python

Работы:

import subprocess 
p = subprocess.Popen(["ls"], stdout=subprocess.PIPE) 
out, err = p.communicate() 
print out 

не работает:

import subprocess 
p = subprocess.Popen(["ls | grep '20'"], stdout=subprocess.PIPE) 
out, err = p.communicate() 
print out 

Отображаемое Ошибка:

[OMITTED]$ python test.py 
Traceback (most recent call last): 
    File "test.py", line 2, in <module> 
    p = subprocess.Popen(["ls | grep '20'"], stdout=subprocess.PIPE) 
    File "/usr/lib64/python2.6/subprocess.py", line 642, in __init__ 
    errread, errwrite) 
    File "/usr/lib64/python2.6/subprocess.py", line 1234, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 
[OMITTED]$ 

Версия: Python 2.6.6 (r266: 84292, 22 января 2014 , 09:42:36) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] на linux2

ответ

1

Труба |является функцией оболочки. Если вы хотите использовать его, вы должны использовать Popen с shell=True.

import subprocess 
p = subprocess.Popen(["ls | grep '20'"], stdout=subprocess.PIPE, shell=True) 
out, err = p.communicate() 
print out 

Примечание:

Warning Passing shell=True can be a security hazard if combined with untrusted input. See the warning under Frequently Used Arguments for details.

Источник: subprocess.Popen

+0

Спасибо за это. Работала отлично. – paullb

+0

@paullb добро пожаловать!) –

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