Python:通过subprocess.call命令

时间:2019-03-04 02:42:14

标签: python subprocess os.system

我有以下代码可在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))

输出: ... = STRING:“ 2017年11月15日”

这段代码可以正常工作,但是我需要用subprocess.call替换os.system,因为os.system非常有限并且不能存储在变量中。

我试图插入subprocess.call,但是我不断收到错误消息:

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

TypeError: 'int' object is not iterable

任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:2)

erm,您正在通过os.system调用 chaining subprocess.call调用。这是完全错误的。隐秘的消息的根本原因是,当os.system尝试迭代参数时,您正在传递返回码subprocess.call,它是一个整数。

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

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

我的建议:

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())

这将以安全,简单的方式运行您的命令,获取输出并将每行输出放入字符串列表中(尝试分配输出对callos.system均无效因为它返回退出代码,而不是程序输出。 由于您的命令可以返回非零的返回码,因此您无法使用check_output,但是可以使用run(但是您需要python 3.5,否则必须使用Popen解决方案,如下所述:Running shell command and capturing the output):

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

答案 1 :(得分:-1)

导入操作系统 导入子流程 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())