我有一个需要转换为python程序的bash脚本。
我运行一个命令并在bash数组中捕获它的输出并迭代它。
diskArr=(`lsblk | grep 'disk' | awk -v col1=1 '{print $col1}'`)
该命令为我提供了系统中所有硬盘的列表,并将其存储在“diskArr”数组中。
我尝试过使用os.system和subprocess.Popen并且没有成功。
>>> import shlex, subprocess
>>> command_line = raw_input()
lsblk | grep 'disk' | awk -v col1=1 '{print $col1}'
>>> args = shlex.split(command_line)
>>> print args
['lsblk', '|', 'grep', 'disk', '|', 'awk', '-v', 'col1=1', '{print $col1}']
>>>
>>>
>>> subprocess.Popen(args)
<subprocess.Popen object at 0x7f8e083ce590>
>>> lsblk: invalid option -- 'v'
Usage:
lsblk [options] [<device> ...]
答案 0 :(得分:2)
到目前为止,您实际上并没有将程序转换为python,而只是尝试使用python作为shell的包装器。但你也可以在python中进行grepping和awking:
import subprocess
import re
lsblk = subprocess.Popen(['lsblk'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in lsblk.stdout:
if 'disk' in line:
parts = re.split(r'\s+', line.strip())
name, majmin, rm, size, ro, devtype = parts[:6]
if len(parts) > 6:
mountpoint = parts[6]
else:
mountpoint = None
print(majmin)
returncode = lsblk.wait()
if returncode:
print("things got bad. real bad.")
这只是一个例子。如果你想要一个引用磁盘的行列表,你可以构建一个包含其中包含'disk'的行的列表:
lsblk = subprocess.Popen(['lsblk'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
blockdevs = [line.strip() for line in lsblk.stdout if 'disk' in line]
returncode = lsblk.wait()
if returncode:
print("things got bad. real bad.")
print(blockdevs)
答案 1 :(得分:0)
您可以在官方文档中查看replacing the shell pipeline,它有一个很好的示例,说明您要做的事情。