Pythonbrew因test_socket无法解析而失败的解决方法?
我在用pythonbrew在Snow Leopard上安装Python 2.6.6的时候遇到了一些问题。第一次安装失败了,出现了readline错误,然后是socket错误。我从源代码安装了readline,这让安装程序在下一次尝试时顺利通过了,但socket错误还是没解决:
test_socket test test_socket failed -- Traceback (most recent call last): File "/Users/gferguson/python/pythonbrew/build/Python-2.6.6/Lib/test/test_socket.py", line 483, in testSockName my_ip_addr = socket.gethostbyname(socket.gethostname()) gaierror: [Errno 8] nodename nor servname provided, or not known
我用系统自带的Python查了一下情况:
>>> import socket >>> my_ip_addr = socket.gethostbyname(socket.gethostname()) Traceback (most recent call last): File "", line 1, in socket.gaierror: [Errno 8] nodename nor servname provided, or not known >>> socket.gethostname() 'S1WSMA-JHAMI' >>> socket.gethostbyname('S1WSMA-JHAMI') Traceback (most recent call last): File "", line 1, in socket.gaierror: [Errno 8] nodename nor servname provided, or not known >>> socket.gethostbyname('google.com') '74.125.227.20'
我还用Ruby的IRB工具确认了一下问题:
IPSocket.getaddress(Socket.gethostname) SocketError: getaddrinfo: nodename nor servname provided, or not known
所以,我不太确定这是解析器不理解主机名的bug,还是机器的配置有点奇怪,或者是我们网络的DNS查找出了问题,但无论是什么原因,安装程序都不太高兴。
不过我觉得这只是安装程序的小问题,所以我觉得可以强行让测试通过,但我不太确定怎么告诉pythonbrew忽略这个测试值,或者特别通过test_socket测试。
我还看到了一些状态信息,但还没搞清楚这些信息是否重要:
33 tests skipped: test_al test_bsddb test_bsddb3 test_cd test_cl test_codecmaps_cn test_codecmaps_hk test_codecmaps_jp test_codecmaps_kr test_codecmaps_tw test_curses test_dl test_epoll test_gdbm test_gl test_imageop test_imgfile test_largefile test_linuxaudiodev test_normalization test_ossaudiodev test_pep277 test_py3kwarn test_smtpnet test_socketserver test_startfile test_sunaudiodev test_timeout test_urllib2net test_urllibnet test_winreg test_winsound test_zipfile64 1 skip unexpected on darwin: test_dl
有没有人有在Snow Leopard上用pythonbrew安装Python 2.6.6的经验?
更新:我刚刚在我的MacBook Pro上用Snow Leopard运行了socket.gethostbyname(socket.gethostname())
这个命令,结果成功返回了我的IP地址,所以看起来问题出在工作环境的系统配置上。我打算去StackOverflow的“Apple”板块问问,看看有没有人知道这可能是什么问题。
2 个回答
我在OSX 10.7上遇到了完全相同的问题,不管是用标准的Perl还是Macports的Perl。
看起来socket.gethostname()
这个函数是能正常工作的,但在我的Mac上,运行它的返回结果(这和在终端里运行hostname命令是一样的)却不行。
如果我这样做:
local_ip = socket.gethostbyname(local_ip+".local")
我可以毫无问题地获取到我的IP地址。
所以这可能是OSX的一个小毛病,或者是我的设置有点奇怪。我更倾向于后者,因为Zeroconf.py在我的机器上因为这个问题而失败,我相信作者应该会注意到这个问题。
解决办法是强制让 pythonbrew
安装,尽管出现了错误。
我用内置的 Python、Perl 和 Ruby 测试了 socket 的响应,它们在解析本地主机名称时都遇到了同样的问题。我在我的一台 Linux 电脑上用当前版本的 Ruby 和 Python 测试,调用是正常的,所以我觉得问题可能出在那台 Mac 的配置上。
在强制安装后,我测试了对其他主机的 socket 调用,得到了预期的结果,做其他网络任务也没有遇到问题,所以我觉得一切都很好。