Python 2.6 - 传递| char进入os.system in for循环

时间:2012-09-12 17:17:56

标签: python for-loop os.system

我有一个IP列表,我想运行一个whois(使用linux工具whois),只看到Country选项。

这是我的剧本:

import os
import time

iplist = open('ips.txt').readlines()

for i in iplist:
        time.sleep(2)
        print "Country: IP {0}".format(i)
        print os.system("whois -h whois.arin.net + {0} | grep Country ".format(i))

所以我想显示正在运行的IP,然后我只想使用grep查看Country信息。我运行它并且没有运行grep时看到这个错误:

sh: -c: line 1: syntax error near unexpected token `|'
sh: -c: line 1: ` | grep Country '

下面这段代码是有效的,所以它必须是我的for循环的问题:

 print os.system("whois -h whois.arin.net + {0} | grep Country ".format('8.8.8.8'))

我做错了什么?谢谢!!!!

2 个答案:

答案 0 :(得分:6)

您不会从您从文件中读取的行中删除尾随换行符。因此,您将向os.system传递"whois -h whois.arin.net + a.b.c.d\n | grep Country"之类的字符串。 shell将字符串解析为两个命令并抱怨“意外令牌”在第二个开头。这解释了当您使用"8.8.8.8"等手工制作的字符串时没有错误的原因。

睡眠后添加i = i.strip(),问题就会消失。

答案 1 :(得分:1)

user4815162342关于您遇到的问题是否正确,但我建议您将os.system替换为subprocess.Popen吗?从system调用中捕获输出并不直观..如果您希望除了屏幕以外的任何地方,您可能会遇到问题

from subprocess import Popen, PIPE

server = 'whois.arin.net'

def find_country(ip):
    proc = Popen(['whois', '-h', server, ip], stdout = PIPE, stderr = PIPE)
    stdout, stderr = proc.communicate()

    if stderr:
        raise Exception("Error with `whois` subprocess: " + stderr)

    for line in stdout.split('\n'):
        if line.startswith('Country:'):
            return line.split(':')[1].strip() # Good place for regex


for ip in [i.strip() for i in open('ips.txt').readlines()]:
    print find_country(ip)

Python在字符串处理方面非常棒 - 应该没有理由创建grep子进程来模式匹配单独子进程的输出。