Python 2.7 循环多次调用 subprocess.check_output
我在使用subprocess.check_output这个函数打印输出时遇到了一些问题。我有一个包含IP地址的文件ip.txt,我把这些地址读出来并存储到一个列表ips里。然后我遍历这个列表,调用wmic命令来获取每台机器的一些信息,但奇怪的是,只有最后一个命令的输出能被打印出来。从命令行的输出来看,我能看到每次都会打印'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
命令行输出:
正在尝试:172.16.5.133
输出
完成
正在尝试:172.16.5.135
输出
完成
正在尝试:172.16.5.98
输出
完成
正在尝试:172.16.5.131
输出
名称 用户名 DOMAINWS48 DOMAIN\staff
完成
1 个回答
在这些代码中,你是逐行读取一个文件的内容:
f_in = open('ip.txt', 'r')
ips = []
for ip in f_in:
ips.append(ip)
不过,每一行的末尾都有一个换行符,这个换行符会让每行的内容多出一些不必要的字符。这样一来,你在处理IP地址的时候,就把这个换行符也当成了IP地址的一部分。为了避免这个问题,你可能需要把每行末尾的换行符 \n
去掉:
f_in = open('ip.txt', 'r')
ips = []
for ip in f_in:
ips.append(ip.strip('\n'))
strip('\n')
这个方法可以去掉字符串开头和结尾的换行符。关于这个字符串方法的详细信息,可以在Python文档中找到:
str.strip([chars])
这个方法会返回一个新的字符串,去掉开头和结尾的指定字符。chars参数是一个字符串,用来指定要去掉的字符。如果不提供这个参数或者设置为None,默认会去掉空白字符。chars参数并不是只去掉开头或结尾的字符,而是会去掉所有组合的字符:
你也可以用类似下面的代码一次性读取文件中的所有行:
ips = [line.strip('\n') for line in f_in.readlines()]
我猜你的 ip.txt
文件每一行都有一个IP地址,而文件的最后一行没有换行符 \n
,在这种情况下,你的代码是可以正常工作的。