在Mac OS X上使用python sockets时出现AttributeError: 'module' object has no attribute 'IF_INET

4 投票
1 回答
5932 浏览
提问于 2025-04-16 22:20

我在Mac OS X 10.6上尝试一些Python网络编程。我使用的是Homebrew安装的Python 2.7,想运行一本叫《Python网络编程基础》的书里的简单脚本(这本书真的很不错),这个脚本包含了一个UDP客户端和服务器,但在使用socket模块的变量时遇到了之前提到的AttributeError错误。脚本内容如下:

#! /usr/bin/env python

import socket, sys

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

MAX = 65535
PORT = 1060

if sys.argv[1:] == ['server']:
    s.bind(('127.0.0.1', PORT))
    print('Listening at', s.getsockname())
    while True:
        data, address = s.recvfrom(MAX)
        print('The client at ', address, ' says ', repr(data))
        s.sendto('Your data was %d bytes' % len(data), address)

elif sys.argv[1:] == ['client']:
    print('address before sending: ', s.getsockname())
    s.sendto('This is my message', ('127.0.0.1', PORT))
    print('address after sending: ', s.getsockname())
    data, address = s.recvfrom(MAX)
    print('The server at ', address, ' says ', repr(data))
else:
    print >>sys.stderr, 'usage: udp_local.py client|server'

通过命令python script.py server运行这个脚本时,出现了以下错误:

Traceback (most recent call last):
  File "udp_local.py", line 5, in <module>
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
AttributeError: 'module' object has no attribute 'AF_INET'

我在Python控制台上做了一些实验,运行import socket后,似乎无法获取任何模块变量。我在网上查了很多资料,但还没有找到相同问题的解决办法。有没有人能提供一些见解呢?顺便说一下,这里是env python的输出:

Python 2.7.1 (r271:86832, Jul 10 2011, 10:39:45) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin

1 个回答

6

我看了一下Python的源代码。在某些平台上,AF_INET是在SOCKET.pyIN.py中定义的,这些文件是从/usr/include/sys/socket.h或者类似的地方自动生成的。

我其实没找到在OSX上这个是怎么定义的,但可能你的版本有些奇怪。

最有可能的问题是你违反了一个重要的规则——不要把文件命名成标准库中的模块名。如果在你的路径中或者和udp_local.py在同一个目录下有一个socket.py文件,就会导致这样的错误。我最近在这里回答问题的时候,也犯了类似的错误,用了argparse

作为一个临时解决办法,你可以试试把AF_INET设置为2或者1——大多数地方是2,但在非Unix平台上可能是1

撰写回答