Python 2.7 循环多次调用 subprocess.check_output

0 投票
1 回答
672 浏览
提问于 2025-04-29 12:30

我在使用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 个回答

0

在这些代码中,你是逐行读取一个文件的内容:

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,在这种情况下,你的代码是可以正常工作的。

撰写回答