如何使用子进程模块运行此代码?
commands.getoutput('sudo blkid | grep 'uuid' | cut -d " " -f 1 | tr -d ":"')
我已经尝试过了,但它根本不起作用
out_1 = subprocess.Popen(('sudo', 'blkid'), stdout=subprocess.PIPE)
out_2 = subprocess.Popen(('grep', 'uuid'), stdin=out_1.stdout, stdout=subprocess.PIPE)
out_3 = subprocess.Popen(('cut', '-d', '" "', '-f', '1'), stdin=out_2.stdout, stdout=subprocess.PIPE)
main_command = subprocess.check_output(('tr', '-d', '":"'), stdin=out_3.stdout)
main_command
错误:cut:分隔符必须是单个字符
答案 0 :(得分:2)
from subprocess import check_output, STDOUT
shell_command = '''sudo blkid | grep 'uuid' | cut -d " " -f 1 | tr -d ":"'''
output = check_output(shell_command, shell=True, stderr=STDOUT,
universal_newlines=True).rstrip('\n')
顺便说一句,除非使用grep -i
,否则它在我的系统上不返回任何内容。在后一种情况下,它返回设备。如果这是你的意图那么你可以使用不同的命令:
from subprocess import check_output
devices = check_output(['sudo', 'blkid', '-odevice']).split()
我正在尝试不使用shell = True
如果您控制命令,则可以使用shell=True
,即,如果您不使用用户输入来构造命令。将shell命令视为一种特殊语言,允许您简明扼要地表达您的意图(如字符串处理的正则表达式)。它比几行不使用shell的代码更具可读性:
from subprocess import Popen, PIPE
blkid = Popen(['sudo', 'blkid'], stdout=PIPE)
grep = Popen(['grep', 'uuid'], stdin=blkid.stdout, stdout=PIPE)
blkid.stdout.close() # allow blkid to receive SIGPIPE if grep exits
cut = Popen(['cut', '-d', ' ', '-f', '1'], stdin=grep.stdout, stdout=PIPE)
grep.stdout.close()
tr = Popen(['tr', '-d', ':'], stdin=cut.stdout, stdout=PIPE,
universal_newlines=True)
cut.stdout.close()
output = tr.communicate()[0].rstrip('\n')
pipestatus = [cmd.wait() for cmd in [blkid, grep, cut, tr]]
注意:此处引号内没有引号(无'" "'
,'":"'
)。与前一个命令和commands.getoutput()
不同,它不捕获stderr。
plumbum
提供了一些语法糖:
from plumbum.cmd import sudo, grep, cut, tr
pipeline = sudo['blkid'] | grep['uuid'] | cut['-d', ' ', '-f', '1'] | tr['-d', ':']
output = pipeline().rstrip('\n') # execute
请参阅How do I use subprocess.Popen to connect multiple processes by pipes?
答案 1 :(得分:0)
将命令传递为一个字符串,如下所示:
main_command = subprocess.check_output('tr -d ":"', stdin=out_3.stdout)
如果您有多个命令,并且想要逐个执行,请将它们作为列表传递:
main_command = subprocess.check_output([comand1, command2, etc..], shell=True)