Python 语法无效(子进程)

Python Invalid Syntax (subprocess)

当通过 subprocess.check_output() 运行 这个命令时,我发现了麻烦:

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

Python returns 语法无效,尽管这适用于 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

你没有逃避你的报价;你不能只在你的字符串文字中包含 ' 而不确保它不被视为 closing 引号。

所以代替:

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)

您可以使用 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)