【问题标题】:How to save a shell-script-printout within python script in list or array?如何在列表或数组中的 python 脚本中保存 shell-script-printout?
【发布时间】:2017-05-11 14:00:24
【问题描述】:

我想在 python 脚本中运行 shell 命令。并将打印输出保存在列表或数组中。

例如shell命令的打印输出如下

root@cic-1:~# for i in $(neutron net-list | grep -i cscf2 | awk '{print $2}'); do neutron net-show $i | grep -i segmentation|awk '{print $4}' ; done
2006
2022
2023
2081
root@cic-1:~#

我希望将此打印输出保存在这样的列表中

[2006,2022,2023,2081]

我已经完成了如下的python代码

#!/usr/pkg/bin/python
import subprocess

vlans= subprocess.Popen ("for i in $(neutron net-list | grep -i cscf2 | awk '{print $2}'); do neutron net-show $i | grep -i segmentation|awk '{print $4}' ; done", shell=True, stdout=subprocess.PIPE).communicate()[0]
print vlans[0]

输出是 2 ,但是我希望 vlans[0] 是 2006

【问题讨论】:

  • 看起来你想要vlans.stdout的文件内容(见docs)。我不知道如何使用它(在 Python 中不强),但这是我在谷歌搜索时发现的
  • 我已经尝试过使用 stdout.read() 但仍然不起作用。
  • 问题是所有打印输出保存为一个长字符串

标签: python list shell output


【解决方案1】:

如果您希望vlans[0] 成为输出的第一行,则需要将输出拆分为行。为此,我在vlans = ... 命令的末尾添加了.split('\n')

>>> vlans= subprocess.Popen ('printf "%s\n" 2006 2022 2023 2081', shell=True, stdout=subprocess.PIPE).communicate()[0].split('\n')
>>> vlans
['2006', '2022', '2023', '2081', '']
>>> vlans[0]
'2006'

当然,因为我没有 neutronnet-list,所以我替换了另一个 shell 命令,它提供了与您显示的相同的输出。

改进

Shell 输出通常包含最后一个换行符。但是,当 python 的 split 函数看到最后的换行符时,它会创建一个最终的空字符串。为了消除这种情况,我们可以将strip 应用于输出,然后将其传递给split

>>> vlans= subprocess.Popen ('printf "%s\n" 2006 2022 2023 2081', shell=True, stdout=subprocess.PIPE).communicate()[0].strip().split('\n')
>>> vlans
['2006', '2022', '2023', '2081']
>>> vlans[0]

根据您的目标,您可能希望使用rstrip('\n') 代替更饥饿的strip()

【讨论】:

  • 最后一个空值 ' ' 是什么?为什么要添加到列表中?
  • @ne9een 很好的观察。我通过讨论更新了答案,并包括了一种消除它的方法。
【解决方案2】:

您可以使用 subprocess.check_output 来(更)轻松地捕获命令的输出。这在功能上等同于您所拥有的。

vlans = subprocess.check_output(
    "for i in $(neutron net-list | grep -i cscf2 | awk '{print $2}'); "
    "do neutron net-show $i | grep -i segmentation|awk '{print $4}' ; done")

如果您希望将 vlan 作为字符串列表,您可以这样做:

vlans = vlans.splitlines()

如果您想要一个整数列表,请改为:

vlans = [int(v) for v in vlans.splitlines()]

【讨论】:

  • 文件“Brad.py”,第 3 行,在 vlans = subprocess.check_output("for i in $(neutron net-list | grep -i cscf2 | awk '{print $2} '); do neutron net-show $i | grep -i segmentation|awk '{print $4}' ; done") 文件“/usr/lib/python2.7/subprocess.py”,第 566 行,在 check_output 进程 = Popen(stdout=PIPE, *popenargs, **kwargs) 文件“/usr/lib/python2.7/subprocess.py”,第 710 行,在 init errread, errwrite) 文件“/usr/ lib/python2.7/subprocess.py",第 1327 行,在 _execute_child raise child_exception OSError: [Errno 2] No such file or directory
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 2013-01-04
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多