Python:通过subprocess.call命令重复

Python: Reiterating through subprocess.call command

我有以下代码来重新遍历 IP 地址列表以查找 SNMP 字符串:

输入:

import os
import subprocess
ip_list = ['10.10.10.10','10.10.10.11']
snmp = "snmpget -v1 -c public "

for x in ip_list:
     command = os.system(str(snmp + x))

输出: ... = 字符串:“11/15/2017”

此代码工作正常,但我需要将 os.system 替换为 subprocess.call,因为 os.system 非常有限,无法存储在变量中。

我尝试插入 subprocess.call 但我一直收到错误消息:

results = subprocess.call(os.system(str(snmp + r + static_oid + z)), shell=True)

TypeError: 'int' object is not iterable

非常感谢任何帮助,谢谢!

erm,您正在 链接 os.system 调用与 subprocess.call 调用。这是完全错误的。神秘消息的根本原因是当 subprocess.call 尝试迭代参数时,您正在传递 os.system 的 return 代码,它是一个整数。

切换到 subprocess 是个好主意,因为 os.system 已被弃用并且容易出现安全问题。也就是说,如果您考虑删除 shell=True.

要删除 shell=True,您必须传递一个 列表 参数,而不是自己编写参数字符串。

我的建议:

import os
import subprocess
ip_list = ['10.10.10.10','10.10.10.11']
snmp = ["snmpget","-v1","-c","public"]   # list of arguments

outputs = []
for x in ip_list:
     cp = subprocess.run(snmp + [x],check=False)
     outputs.append(cp.stdout.decode())

这会以一种安全、简单的方式运行您的命令,获取输出并将每个输出行放入字符串列表中(尝试分配输出对 call 或 [=12 不起作用=] 因为它 return 是 退出代码 ,而不是程序输出。 由于您的命令可以 return 非零 return 代码,因此您不能使用 check_output but you can use run is what you need (but you need python 3.5, else you'll have to use a Popen solution, described here: Running shell command and capturing the output):

 p = subprocess.Popen(snmp + [x])
 result = p.communicate()[0]

进口os 导入子流程 ip_list = ['10.10.10.10','10.10.10.11'] snmp = ["snmpget","-v1","-c","public"] # 参数列表

输出=[] 对于 ip_list 中的 x: cp = subprocess.run(snmp + [x],check=False) outputs.append(cp.stdout.decode())