3

在一段时间没有使用 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] 检查 SDK 更新。
INFO 2013-07-11 07:24:46,230 sdk_update_checker.py:288] 此 SDK 版本比宣传的版本更新。
警告 2013-07-11 07:24:46,443 simple_search_stub.py:955] 无法从 /tmp/appengine.batterybotinfo.darshan/search_indexes 读取搜索索引
回溯(最近一次通话最后):
  文件“/home/darshan/bin/dev_appserver.py”,第 182 行,在
    _run_file(__file__, globals())
  _run_file 中的文件“/home/darshan/bin/dev_appserver.py”,第 178 行
    execfile(script_path, globals_)
  文件“/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/devappserver2.py”,第 695 行,在
    主要的()
  文件“/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/devappserver2.py”,第 688 行,在 main
    dev_server.start(选项)
  文件“/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/devappserver2.py”,第 659 行,开始
    apis.start()
  文件“/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/api_server.py”,第 137 行,开始
    超级(APIServer,自我).start()
  文件“/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/wsgi_server.py”,第 295 行,开始
    如果 self._start_all_dynamic_port(host_ports):
  _start_all_dynamic_port 中的文件“/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/wsgi_server.py”,第 348 行
    server.start()
  文件“/home/darshan/software/google_appengine/google/appengine/tools/devappserver2/wsgi_server.py”,第 194 行,开始
    socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
TypeError: getaddrinfo() 参数 1 必须是字符串或无

我的第一个想法是我可能使用了不正确的 Python 版本。果然,我用的是 2.7.5,而且文档明确指出 2.5 是必须的。但是,文档似乎已经过时了,因为在安装 2.5 并将我的系统设置为使用它之后,我收到了这个错误:

错误:不支持 Python 2.5。请使用 2.7 版本。

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

我不确定这是否是dev_appserver.pyPython 代码中的错误(我猜不是,因为它已经发布了一个月),我的 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(一个整数,而不是字符串),并且port是一个看似随机的五位整数。

我已经尝试对 or 进行硬编码host,但随后"127.0.0.1"又出现了另一个错误。我感到头晕目眩,我怀疑我不会通过改变我不太了解的事情来解决真正的问题。谷歌搜索错误消息没有帮助。port80800

4

2 回答 2

9

持续的谷歌搜索最终得到了回报。尽管这个问题有一个非常不同(而且信息量更大)的错误消息,但解决方案结果是相同的:确保/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现在启动并正常工作。

于 2013-07-11T09:25:33.093 回答
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)
于 2013-08-17T00:36:17.380 回答