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)
当通过 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)