python - Python:通过 subprocess.call 命令重复
问题描述
我有以下代码可以重新遍历 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))
输出: ... = 字符串:“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
任何帮助将不胜感激,谢谢!
解决方案
erm ,您正在将os.system
电话与subprocess.call
电话联系起来。这是完全错误的。神秘的消息根本原因是,当您尝试迭代参数时,您传递的返回码os.system
是一个整数。subprocess.call
切换到subprocess
是一个好主意,因为os.system
已弃用并且容易出现安全问题。也就是说,如果你考虑放弃shell=True
.
要 drop 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())
这会以安全、简单的方式运行您的命令,获取输出并将每个输出行放在字符串列表中(尝试分配输出不起作用,call
或者os.system
因为它返回退出代码,而不是程序输出。因为你的命令可以返回一个你不能使用的非零返回码,check_output
但你可以使用run
你需要的(但你需要 python 3.5,否则你必须使用一个Popen
解决方案,如下所述:运行 shell 命令并捕获输出):
p = subprocess.Popen(snmp + [x])
result = p.communicate()[0]
推荐阅读
- python - 无法在 tkinter 中隐藏画布
- javascript - 如何将引导滑块放置在包含 fon 的部分以完美显示滑块?
- robotframework - 如何删除机器人框架中的临时文件?
- reactjs - 如何使用 redux 工具包调用列表状态项到组件?
- reactjs - 孩子没有在反应中重新渲染
- python - Jupyter Notebook 正在从我的 Excel 工作表中删除形状
- jenkins - 如何在 Jenkins SCM 管道中定义参数化的 SVN url
- c - 关于UNIX中复制和删除(cp,rm)的问题
- python - 有人可以帮我解决错误吗:TypeError: +: 'NoneType' and 'NoneType' 不支持的操作数类型
- rpa - 如何下载旧版本的 UiPath Studio?