2015-04-12 103 views
-1

我發現煩惱通過subprocess.check_output()運行此命令時:的Python語法無效(子)

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 –