“getaddrinfo()参数1必须是字符串或无”在Linux上启动dev_appserver.py时出错

时间:2013-07-11 08:33:22

标签: python google-app-engine go getaddrinfo dev-appserver

我暂时没有使用它后重新启动App Engine。我正在使用64位Linux Go运行时版本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和我最初的错误。

我不确定这是dev_appserver.py Python代码中的错误(我猜不是,因为它已经出了一个月),我的Python安装问题,或者其他关于我的问题系统没有根据谷歌的期望进行配置。

除非必要,否则我宁愿不要弄乱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,但后来又出现了另一个错误。我觉得我的头脑,我怀疑我不会通过改变我不理解的事情来解决真正的问题。谷歌搜索错误消息没有帮助。

2 个答案:

答案 0 :(得分:8)

持久的谷歌搜索终于得到了回报。尽管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现在启动并正常运行。

答案 1 :(得分:0)

如果您将第189-194行编辑为此内容,则应该会在Google发布更新之前一直有效。这基本上只是检查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)