【问题标题】:Python: Reiterating through subprocess.call commandPython:通过 subprocess.call 命令重复
【发布时间】:2019-03-04 02:42:14
【问题描述】:

我有以下代码可以重新遍历 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 日”

此代码运行良好,但我需要将 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

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

【问题讨论】:

  • 你能显示你使用的子流程代码吗?还显示变量的值/类型。自动取款机是无法回答的。
  • 哎呀,对不起。更新了变量示例

标签: python subprocess os.system


【解决方案1】:

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

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

而要删除 shell=True,您必须传递一个 list 参数,而不是自己编写 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 解决方案,如下所述:@ 987654323@):

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

【讨论】:

  • 您好,感谢您的快速回复。当我尝试 snmp + [x] 时,我收到 TypeError: cannot concatenate 'str' and 'list' objects。有什么想法可以将 snmp 和变量 x 串起来吗?
  • 那是因为您没有将snmp 更改为列表。再次检查我的答案
  • 我明白了,我的错。将 snmp 变量更新为: snmp = ["snmpget -v1 -c public "] 因为它是一个参数,但现在我收到此错误。 OSError: [Errno 2] 没有这样的文件或目录
  • 检查我的答案再次。从这里粘贴。你只是把你的字符串放在一个列表中,这是不正确的。
  • 嗯,我收到错误消息:subprocess.CalledProcessError: Command '['snmpget', '-v1', '-c', 'public', '10.10.10.10']' returned non -zero exit status 1 再次感谢支持!
【解决方案2】:

导入操作系统 导入子流程 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) 输出.append(cp.stdout.decode())

【讨论】:

    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2021-02-23
    • 2013-03-02
    • 1970-01-01
    • 2013-01-05
    • 2018-02-17
    相关资源
    最近更新 更多