python-geoip 在 python3.4 上不起作用?

Posted

技术标签:

【中文标题】python-geoip 在 python3.4 上不起作用?【英文标题】:python-geoip does not work on python3.4? 【发布时间】:2015-09-15 00:00:52 【问题描述】:

我能够让 geolite2 在 python2.7 上工作 - 但我需要 3.4。我在此链接上找到了 2.7 的说明:http://pythonhosted.org/python-geoip/。还提供了代码片段。

pip install python-geoip
pip install python-geoip-geolite2
>>> from geoip import geolite2
>>> match = geolite2.lookup('17.0.0.1')
>>> match is not None
True

所以我很自然地将所有 pip 更改为 pip3 并安装在新的 VM 上。代码没有错误,但不会从它们的数据库中查找和返回值。

pip3 install python-geoip
pip3 install python-geoip-geolite2

在 2.7 VM 中,当我使用 3.4 时,我将 geoip lib 指向 /usr/local/lib/python2.7/dist-packages - 也没有运气。但是,它可以在同一 VM 上的 2.7 上运行。

我需要做什么才能使其在 3.4 上运行?

【问题讨论】:

【参考方案1】:

python-geoip不支持Python 3,两年没更新了。虽然有一个 pull request 来添加 Python 3 支持,但我不希望它很快被合并和发布。我建议改用official MaxMind geoip2 package。

【讨论】:

正式版是通过网络服务吗?还需要订阅吗? geoip2 包同时支持 Web 服务和数据库,如 these examples 所示。 'geoip2' 是基于订阅的服务吗? geoip2 会提供 ISP 或组织信息吗? geoip2 包可以使用 MaxMind 付费数据库和python-geoip 使用的相同free GeoLite2 databases。 ISP/Organization 仅在付费数据库中。【参考方案2】:

安装:

apt install python3-pip
pip3 install maxminddb 
pip3 install maxminddb-geolite2

使用示例:

#!/usr/bin/python3
# coding=utf-8

from geolite2 import geolite2

reader = geolite2.reader()

# google's ip
match = reader.get('172.217.16.163')
if match:
  # print(match)
  if 'country' in match:
    print(match['country']['iso_code'])
  else:
    print(match['continent']['code'])
else:
  print('') 

【讨论】:

只能通过安装pip3 install maxminddb-geolite2工作【参考方案3】:

python-geoip 支持 python 3(安装 pippip3):

pip3 install python-geoip-python3

输出:

Collecting python-geoip-python3
  Downloading python_geoip_python3-1.3-py2.py3-none-any.whl (7.4 kB)
Installing collected packages: python-geoip-python3
Successfully installed python-geoip-python3-1.3

对于geolite2

pip3 install python-geoip-geolite2

输出:

Successfully built python-geoip-geolite2
Installing collected packages: python-geoip-geolite2
Successfully installed python-geoip-geolite2-2015.303

test_geoip.py 示例:

#!/usr/bin/env python3

import socket
from geoip import geolite2
import argparse
import json

# Setup commandline arguments
parser = argparse.ArgumentParser(description='Get IP Geolocation info')
parser.add_argument('--hostname', action="store", dest="hostname", required=True)

# Parse arguments
given_args = parser.parse_args()
hostname = given_args.hostname
ip_address = socket.gethostbyname(hostname)

print("IP address: 0".format(ip_address))

match = geolite2.lookup(ip_address)

if match is not None:
    print('Country: ',match.country)
    print('Continent: ',match.continent)
    print('Time zone: ', match.timezone)
    print('Location: ', match.location)

运行:

python3 test_geoip.py --hostname=amazon.co.uk

输出:

IP address: 178.236.7.220
Country:  IE
Continent:  EU
Time zone:  Europe/Dublin
Location:  (53.3478, -6.2597)

再次运行:

python3 test_geoip.py --hostname=amazon.co.uk

输出:

IP address: 54.239.34.171
Country:  US
Continent:  NA
Time zone:  America/Los_Angeles
Location:  (47.6103, -122.3341)

【讨论】:

【参考方案4】:

使用 maxmind 数据库:

安装:

maxminddb 
maxminddb-geolite

在您的代码中:

from geolite2 import geolite2

match = geolite2.reader()
geoip = match.get('xxx.xxx.xxx.xxx')

【讨论】:

对我来说,提供的代码似乎混淆了一些东西,因为代码部分geolite2 import 似乎不属于包maxminddbmaxminddb-geolite 对我来说是不可安装的,尽管 pipenv 我怀疑这可能与 maxmind 更改他们的许可政策并且不再向未注册用户提供 geolite-db 有关。请注意,还有一个 pypi-package geolite2 做类似的事情,也由 maxmind 提供,并在包 top_level.txt 中定义了 geolite2

以上是关于python-geoip 在 python3.4 上不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

删除python3.4后,在ubuntu 14.04中没有显示仪表板/终端/侧边栏

如何在linux系统中,将python3.4更新到python3.5

如何在Centos上安装python3.4

关于python3.4版本中的zip函数

python3.4的asyncio用法

在 Windows 上使用 Python3.4 安装 imagescanner 模块