2015-04-12 3 views
-1

я обнаружил проблемы при выполнении этой команды с помощью subprocess.check_output():Python Invalid Синтаксис (подпроцесс)

sed 's/^.*UUID="/UUID="/' 

Python возвращает неверный синтаксис, хотя это работает в командной строке Linux.

Мой Python код:

subprocess.check_output('sudo blkid | sed 's/^.*UUID="/UUID="/' | cut -d '"' -f 2', shell=True) 

и Я получаю ошибку:

File "<stdin>", line 1 
    subprocess.check_output('sudo blkid | sed 's/^.*UUID="/UUID="/' | cut -d '"' -f 2', shell=True) 
              ^
SyntaxError: invalid syntax 
+1

Пожалуйста, покажите нам свой код Python; как вы обрабатывали цитирование в строковом литерале? –

+0

Вот он: subprocess.check_output ('sudo blkid | sed's /^.* UUID = "/ UUID =" /' | cut -d '"' -f 2 ', shell = True) –

+1

Вам нужно [ отредактируйте] ваш вопрос, чтобы добавить эту информацию. Пожалуйста, добавьте * полное сообщение об ошибке *. –

ответ

1

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

Таким образом, вместо:

subprocess.check_output('sudo blkid | sed 's/^.*UUID="/UUID="/' | cut -d '"' -f 2', shell=True) 

использование:

subprocess.check_output('sudo blkid | sed \'s/^.*UUID="/UUID="/\' | cut -d \'"\' -f 2', shell=True) 

или использовать тройной процитировать:

subprocess.check_output('''sudo blkid | sed 's/^.*UUID="/UUID="/' | cut -d '"' -f 2''', shell=True) 
0

Вы можете использовать POPEN к трубе без использования shell=True написания SUDO пароль до stdin:

from subprocess import Popen,PIPE 

p1 = Popen(['sudo', '-S', 'blkid'], stdin=PIPE,stdout=PIPE) 
p1.stdin.write("password\n") 

p2 = Popen(['sed','s/^.*UUID="/UUID="/'], stdin=p1.stdout,stdout=PIPE) 
p1.stdout.close() 
p3 = Popen(['cut', '-d', '"', '-f' ,'2'],stdin=p2.stdout, stdout=PIPE)) 

p2.stdout.close() 

out, err = p3.communicate() 
print(out) 
+0

В чем смысл этого метода в сравнении с shell = True? –

+0

@BlenderUser, как вы вводите пароль? Существует также множество причин не использовать shell = True, search shell = True on SO –

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