繁体   English   中英

你如何在 Windows 中运行这个用于 Linux 的 python 脚本?

[英]How do you run , in Windows , this python script meant for Linux?

我在 Windows 7 计算机上使用 Python 3.5。

我正在尝试运行设计为在 Linux 中运行的 Python 脚本,这本书在 MO Faruque Sarker 博士和 Sam Washington 博士撰写的《Learning Python Network Programming》一书中找到,2015 年 6 月 17 日第 6 章。IP 和 DNS GeoIP 查找

..........代码保存在我的 C 驱动器中为 C:\\Python35\\geoiplookup.py 我已将其从“6_3_geoip_lookup.py”重命名为“geoiplookup.py”....... ...这里是代码,并在http://imgur.com/PM196AV 上以更用户友好的图像显示........

import socket
from geoip import geolite2
import argparse


if __name__ == '__main__':
    # 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) 

..........此脚本将显示类似于以下内容的输出(在 Linux 中):

$ python 6_3_geoip_lookup.py --hostname=amazon.co.uk
IP address: 178.236.6.251
Country:  IE
Continent:  EU
Time zone:  Europe/Dublin

..........我尝试使用以下命令在 Windows 中的 Python GUI shell 中运行 .py 文件,但没有成功。 请参阅http://imgur.com/wZ4m1S5 上的图片........

import geoiplookup
--hostname=amazon.co.uk
    SyntaxError: can't assign to operator

--hostname='amazon.co.uk'
    SyntaxError: can't assign to operator

'--hostname'='amazon.co.uk'
    SyntaxError: can't assign to literal

'--hostname'=amazon.co.uk
    SyntaxError: can't assign to literal

在你指责我没有在命令行中尝试这个之前:

C:\Python35>python geoiplookup.py --hostname=amazon.co.uk

我有,我收到一条错误消息:

IP address: 178.236.6.251
Traceback (most recent call last):
File "geoiplookup.py", line 17, in <module> match = geolite2.lookup(ip_address)
File "c:\Python35\lib\site-packages\geoip.py", line 382, in _read_mmdb_metadata
TypeError: a bytes-like object is required, not 'str'
c:\Python35>

请指教 。 太感谢了。

非常感谢。

您不是在运行 Python 脚本,而是在 Python 解释器中并尝试运行每一行代码。

看看你的 Linux 输出:

$ python 6_3_geoip_lookup.py --hostname=amazon.co.uk
IP address: 178.236.6.251
Country:  IE
Continent:  EU
Time zone:  Europe/Dublin

第一行很重要。 就是您应该在 Windows 命令行上运行的内容:

C:\Python35>python geoiplookup.py --hostname=amazon.co.uk

在 Windows 命令提示符下,运行以下命令:

c:
cd \Python35
python geoiplookup.py --hostname=amazon.co.uk

编辑:看起来在 Python 3.5 上 geoip 包有问题(我发现有人在这里报告了一个问题,该问题与您在不同方法上的错误消息相同)。 评论者似乎提到包裹看起来被遗弃了,尽管我自己没有检查过。 因此,我认为此解决方法可能是您今后的最佳选择。

我不认为这是 Linux 与 Windows 的问题。 我试图在我的 Mac 机器上运行您的脚本,并得到与您在 Windows 上相同的结果。 我试图查看您遇到的更多错误,我发现一篇文章提到他们使用了另一个包,因为它支持 Python 3。那个包是maxminddb-geolite2

它的格式与您使用的格式略有不同,但这是我的代码:

import socket
from geolite2 import geolite2
import argparse
import pprint

if __name__ == '__main__':
    # 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.reader().get(ip_address)

    pp = pprint.PrettyPrinter(indent=4)

    if match is not None:
        print("Country: " + str(match['country']['names']['en']))
        print("Continent: " + str(match['continent']['names']['en']))
        print("Time Zone: " + str(match['location']['time_zone']))
        pp.pprint(match)

正如您所看到的,它在语法上非常相似,只是略有不同。

我这个脚本的输出(没有漂亮的打印):

python3 test.py --hostname=amazon.co.uk
IP address: 178.236.6.251
Country: Ireland
Continent: Europe
Time Zone: Europe/Dublin

这是字典的漂亮打印输出,以防您想知道我如何知道从哪里访问以从匹配字典中获取您想要的输出:

{   'city': {   'geoname_id': 2964574,
                'names': {   'de': 'Dublin',
                             'en': 'Dublin',
                             'es': 'Dublín',
                             'fr': 'Dublin',
                             'ja': 'ダブリン',
                             'pt-BR': 'Dublin',
                             'ru': 'Дублин',
                             'zh-CN': '都柏林'}},
    'continent': {   'code': 'EU',
                     'geoname_id': 6255148,
                     'names': {   'de': 'Europa',
                                  'en': 'Europe',
                                  'es': 'Europa',
                                  'fr': 'Europe',
                                  'ja': 'ヨーロッパ',
                                  'pt-BR': 'Europa',
                                  'ru': 'Европа',
                                  'zh-CN': '欧洲'}},
    'country': {   'geoname_id': 2963597,
                   'iso_code': 'IE',
                   'names': {   'de': 'Irland',
                                'en': 'Ireland',
                                'es': 'Irlanda',
                                'fr': 'Irlande',
                                'ja': 'アイルランド',
                                'pt-BR': 'Irlanda',
                                'ru': 'Ирландия',
                                'zh-CN': '爱尔兰'}},
    'location': {   'latitude': 53.3331,
                    'longitude': -6.2489,
                    'time_zone': 'Europe/Dublin'},
    'registered_country': {   'geoname_id': 2963597,
                              'iso_code': 'IE',
                              'names': {   'de': 'Irland',
                                           'en': 'Ireland',
                                           'es': 'Irlanda',
                                           'fr': 'Irlande',
                                           'ja': 'アイルランド',
                                           'pt-BR': 'Irlanda',
                                           'ru': 'Ирландия',
                                           'zh-CN': '爱尔兰'}},
    'subdivisions': [   {   'geoname_id': 7521314,
                            'iso_code': 'L',
                            'names': {   'en': 'Leinster',
                                         'ja': 'レンスター',
                                         'ru': 'Ленстер'}},
                        {   'geoname_id': 7778677,
                            'names': {'en': 'Dublin City'}}]}

如果你想这样做,你所要做的就是:

import pprint # At the top of the file

pp = pprint.PrettyPrinter(indent=4) # Anywhere in scope
pp.pprint(match) # Print!

更多关于漂亮印刷品的信息在这里

我知道这不是对正在发生的事情的直接答案,但如果我真的弄清楚手头的真正问题是什么,我会更新我的答案。 在那之前,有这个解决方法:)。

解决了:

按照 Kush131 的 pprint 代码解决我的挑战。

如果您在 Windows 中使用 Python 3.5,则需要执行这些额外的步骤来获得 Kush131 可以在 Mac 中获得的输出。

pip install win-unicode-console

在 Windows 的命令行工具中打印俄语和亚洲字符输出时仍然会遇到问题,因为“Windows 控制台对 UTF-8 等编码的支持很差”。 换句话说,“从 Windows 控制台运行 Python,默认情况下仅支持本地 8 位 charmap。”

到目前为止,我发现了两种解决方案:

..........解决方案 1(可以在 Windows 命令行中打印整个输出,但仍然不能打印俄语和亚洲字符,将它们替换为 ???)

c:\Python35>python -m run 6_3_geoip_lookup.py --hostname=amazon.co.uk

..........解决方案 2 与下面这 3 行解决了在“output_utf8.txt”中找到的所需输出的问题

c:\Python35>pip install win-unicode-console
c:\Python35>set PYTHONIOENCODING=utf-8:backslashreplace
c:\Python35>python 6_3_geoip_lookup.py --hostname=amazon.co.uk >output_utf8.txt

如果您不使用该解决方案,您可能会在 Windows 命令提示符中收到此错误:

   File "c:\Python35\lib\encodings\cp437.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-4: cha

另一种解决方案是将 PYTHONIOENCODING(一个 Python 特定的环境变量)添加到您的 Windows Path 环境变量中。 代码将运行,但俄语和亚洲字符仍将替换为 ??? 像解决方案 1 中的输出

..........ie 将此 Python 特定的环境变量 PYTHONIOENCODING=utf-8 添加到您的 Windows Path 环境变量

IE

Windows 7 --- > 控制面板 --- > 系统 --- > 高级系统设置(在左侧)--- > 高级 --- > 环境变量 --- > 系统变量(底部框)- -> 路径 ---> 编辑 ---> 将此粘贴到末尾长行的末尾:;PYTHONIOENCODING=utf-8;

..........然后在 Windows 命令提示符中键入此内容。 .....

c:\Python35>
c:\Python35>python 6_3_geoip_lookup.py --hostname=amazon.co.uk

--- > 输出:

IP address: 178.236.7.220
Country: Ireland
Continent: Europe
Time Zone: Europe/Dublin
{   'city': {   'geoname_id': 2964574,
            'names': {   'de': 'Dublin',
                         'en': 'Dublin',
                         'es': 'Dubl??n',
                         'fr': 'Dublin',
                         'ja': '??€??–??????',
                         'pt-BR': 'Dublin',
                         'ru': '?”???±??????',
                         'zh-CN': 'é???????—'}},.......

c:\Python35>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM