【问题标题】:Python 2.7 Loop through multiple subprocess.check_output callsPython 2.7 循环通过多个 subprocess.check_output 调用
【发布时间】:2014-12-20 15:42:24
【问题描述】:

我在打印 subprocess.check_output 调用的输出时遇到问题。 我在 ip.txt 中有一个 IP 地址列表,我从中读取并保存到列表 ips。 然后我遍历该列表并调用 wmic 命令以从该机器获取一些详细信息,但是只有最后一个名为打印输出的命令。通过查看 CLI 输出,我可以看到每个都调用了 print 'Complete\n',但 check_output 没有返回任何输出变量。

有什么想法吗?谢谢

Python 代码:

from subprocess import check_output

f_in = open('ip.txt', 'r')
ips = []

for ip in f_in:
    ips.append(ip)

f_in.close()
f_out = open('pcs.txt','w')

for ip in ips:
    cmd = 'wmic /node:%s computersystem get name,username' % (ip)
    f_out.write('Trying %s\n'%ip)
    print 'Trying: %s' % (ip)
    try:
        output = check_output(cmd,shell=True)
        f_out.write(output)
        print 'Output\n--------\n%s' % output
        print 'Complete\n'
    except:
        f_out.write('Could not complete wmic call... \n\n')
        print 'Failed\n'

f_out.close()

文件输出:

Trying 172.16.5.133

Trying 172.16.5.135

Trying 172.16.5.98

Trying 172.16.5.131
Name        UserName        
DOMAINWS48  DOMAIN\staff

CLI 输出

正在尝试:172.16.5.133

输出

完成

正在尝试:172.16.5.135

输出

完成

正在尝试:172.16.5.98

输出

完成

正在尝试:172.16.5.131

输出

名称用户名 DOMAINWS48 DOMAIN\员工

完成

【问题讨论】:

  • 如果您直接从命令行为 172.16.5.133、172.16.5.135 和 172.16.5.98 发出 WMIC 命令,您会得到实际输出还是错误?如果您收到错误,那么该输出将转到 stderr,您需要使用 output = check_output(cmd,stderr=subprocess.STDOUT,shell=True) 之类的内容来捕获它
  • 如果我直接为每个 IP 发出 WMIC 命令,我会得到正确的输出。我试过在 ip.txt 中只有 2 个以上的 IP。在每种情况下,只有最后一个 IP 会打印所需的结果。此外,如果我为 WMIC 调用提供了错误的用户/通行证,则错误会显示在 CLI 输出中(仅在最后一次调用中。)

标签: python subprocess wmic


【解决方案1】:

在这些行中,您逐行读取文件:

f_in = open('ip.txt', 'r')
ips = []

for ip in f_in:
    ips.append(ip)

不幸的是,每一行都有一个行尾字符仍然终止每一行。然后将换行符作为 IP 地址的一部分传入。您可能需要考虑从您阅读的每一行的末尾删除换行符 \n

f_in = open('ip.txt', 'r')
ips = []

for ip in f_in:
    ips.append(ip.strip('\n'))

strip('\n') 将删除字符串开头和结尾的所有换行符。这个字符串方法的信息可以在Python documentation找到:

str.strip([chars])

返回删除了前导和尾随字符的字符串副本。 chars 参数是一个字符串,指定要删除的字符集。如果省略或无,chars 参数默认删除空格。 chars 参数不是前缀或后缀;相反,它的值的所有组合都被剥离:

您还可以读取文件中的所有行,例如:

ips = [line.strip('\n') for line in f_in.readlines()]

我的猜测是您的 ip.txt 文件的每一行都有一个 IP 地址,并且文件的最后一行没有以换行符 \n 终止,在这种情况下,您的代码可以正常工作。

【讨论】:

  • 这是我的问题。非常感谢。
猜你喜欢
  • 2013-08-17
  • 1970-01-01
  • 2019-03-22
  • 2020-06-05
  • 2017-09-23
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 2018-06-29
相关资源
最近更新 更多