Python 2.7循环遍历多个subprocess.check_output调用

时间:2014-10-24 18:28:35

标签: python subprocess wmic

我遇到了从subprocess.check_output调用打印输出的问题。 我在ip.txt中有一个IP地址列表,我从中读取并保存到列表ips。 然后我迭代该列表并调用wmic命令从该机器获取一些细节,但是只有最后一个命令打印输出。通过查看CLI输出,我可以看到为每个输出打印'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

     

输出

     

名称UserName   DOMAINWS48 DOMAIN \ staff

     

完整

1 个答案:

答案 0 :(得分:0)

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

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参数是一个字符串,指定要删除的字符集。如果省略或None,则chars参数默认为删除空格。 chars参数不是前缀或后缀;相反,它的所有值组合都被剥离了:

您还可以使用以下内容读取文件中的所有行:

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

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