“getaddrinfo()参数1必须是string或None”在Linux上启动dev_appserver.py时出错

2024-06-22 10:22:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经有一段时间没有使用App Engine了,现在我要重新开始使用它了。我使用的是64位LinuxGo运行时版本1.8.1。

我相信我正确地遵循了文档中的步骤,并且我相信我做了过去正确工作的事情,但是在尝试启动dev_appserver.py时,我得到了这个错误:

$ dev_appserver.py .
INFO     2013-07-11 07:24:45,919 sdk_update_checker.py:244] Checking for updates to the SDK.
INFO     2013-07-11 07:24:46,230 sdk_update_checker.py:288] This SDK release is newer than the advertised release.
WARNING  2013-07-11 07:24:46,443 simple_search_stub.py:955] Could not read search indexes from /tmp/appengine.batterybotinfo.darshan/search_indexes
Traceback (most recent call last):
  File "/home/darshan/bin/dev_appserver.py", line 182, in 
    _run_file(__file__, globals())
  File "/home/darshan/bin/dev_appserver.py", line 178, in _run_file
    execfile(script_path, globals_)
  File "/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 695, in 
    main()
  File "/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 688, in main
    dev_server.start(options)
  File "/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 659, in start
    apis.start()
  File "/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/api_server.py", line 137, in start
    super(APIServer, self).start()
  File "/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/wsgi_server.py", line 295, in start
    if self._start_all_dynamic_port(host_ports):
  File "/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/wsgi_server.py", line 348, in _start_all_dynamic_port
    server.start()
  File "/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/wsgi_server.py", line 194, in start
    socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
TypeError: getaddrinfo() argument 1 must be string or None

我的第一个想法是我可能使用了不正确的Python版本。果然,我使用的是2.7.5,而且the documentation清楚地说明了2.5是必要的。但是,文档似乎已经过时,因为在安装2.5并将系统设置为使用它之后,我出现了以下错误:

Error: Python 2.5 is not supported. Please use version 2.7.

好吧,回到2.7.5和我最初的错误。

我不确定这是否是Python代码中的一个bug(我猜不会,因为它已经发布了一个月)、Python安装的问题,或者关于我的系统的其他一些没有按照Google的期望配置的问题。

除非有必要,否则我不想弄乱dev_appserver.py代码,但我很乐意深入研究它,以帮助找出问题所在。错误在第194行;以下是第190-195行:

# AF_INET or AF_INET6 socket
# Get the correct address family for our host (allows IPv6 addresses)
host, port = self.bind_addr
try:
  info = socket.getaddrinfo(host, port, socket.AF_UNSPEC,
                            socket.SOCK_STREAM, 0, socket.AI_PASSIVE)

我已经确定包含方法被调用了两次。第一次host总是"127.0.0.1",而port0。第二次是崩溃;host总是10(一个int,而不是字符串),而port是一个看似随机的五位数int

我已经尝试过将host硬编码为"127.0.0.1",将port硬编码为80800,但后来又出现了另一个错误。我觉得自己被蒙在鼓里,我怀疑我不会通过改变我不太明白的事情来解决真正的问题。在谷歌上搜索错误信息没有帮助。


Tags: inpyhosthomeportgooglelinesoftware
2条回答

持续的谷歌搜索最终获得了回报。尽管this question有一个非常不同(而且信息量更大)的错误消息,但解决方案却是相同的:确保/etc/hosts只包含localhost的一个条目。

值得注意的是,我的系统包含以下两行:

127.0.0.1  localhost
::1        localhost

注释掉第二个(并在文档中添加注释)解决了我的问题:

127.0.0.1  localhost

# Having multiple localhost entries causes App Enginge dev_appserver.py to fail.
#  IPv6 not currently needed, and the dev server IS needed, so commenting out.
#::1        localhost

dev_appserver.py现在启动并正常工作。

如果你编辑第189-194行,它应该可以工作,直到谷歌发布一个更新。这基本上只是检查host的类型,如果不是字符串,则提前返回。

189    # AF_INET or AF_INET6 socket
190    # Get the correct address family for our host (allows IPv6 addresses)
191     host, port = self.bind_addr
192     try:
193       if type(host) is not str:
194         return
195       info = socket.getaddrinfo(host, port, socket.AF_UNSPEC,
196                                 socket.SOCK_STREAM, 0, socket.AI_PASSIVE)

相关问题 更多 >