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())
我有以下代码来重新遍历 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())