Pythonbrew因test_socket无法解析而失败的解决方法?

0 投票
2 回答
2643 浏览
提问于 2025-04-16 06:30

我在用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 个回答

2

我在OSX 10.7上遇到了完全相同的问题,不管是用标准的Perl还是Macports的Perl。

看起来socket.gethostname()这个函数是能正常工作的,但在我的Mac上,运行它的返回结果(这和在终端里运行hostname命令是一样的)却不行。

如果我这样做:

local_ip = socket.gethostbyname(local_ip+".local")

我可以毫无问题地获取到我的IP地址。

所以这可能是OSX的一个小毛病,或者是我的设置有点奇怪。我更倾向于后者,因为Zeroconf.py在我的机器上因为这个问题而失败,我相信作者应该会注意到这个问题。

0

解决办法是强制让 pythonbrew 安装,尽管出现了错误。

我用内置的 Python、Perl 和 Ruby 测试了 socket 的响应,它们在解析本地主机名称时都遇到了同样的问题。我在我的一台 Linux 电脑上用当前版本的 Ruby 和 Python 测试,调用是正常的,所以我觉得问题可能出在那台 Mac 的配置上。

在强制安装后,我测试了对其他主机的 socket 调用,得到了预期的结果,做其他网络任务也没有遇到问题,所以我觉得一切都很好。

撰写回答