Mac OS X 上的 python 套接字给出 AttributeError: 'module' object has no attribute 'IF_INET'

jer*_*son 4 python sockets macos homebrew udp

我正在 Mac OS X 10.6 上尝试一些 python 网络编程。我正在使用 Homebrew 安装的 Python 2.7,并试图从包含 UDP 客户端和服务器的Python 网络编程基础(顺便说一句好书)运行一个简单的脚本,但是在尝试使用来自插座模块。脚本如下:

#! /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'
Run Code Online (Sandbox Code Playgroud)

通过运行此脚本会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'
Run Code Online (Sandbox Code Playgroud)

我已经尝试过 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
Run Code Online (Sandbox Code Playgroud)

agf*_*agf 6

我查看了 Python 源代码。在某些平台上,AF_INETSOCKET.py或 中定义IN.py,它是从/usr/include/sys/socket.h或类似的东西自动生成的。

我实际上无法看到为 OSX 定义的位置,但是您的版本中可能发生了一些奇怪的事情。

到目前为止,最可能的问题是您违反了一条重要规则——永远不要以标准库中的模块命名文件。一个socket.py在你的路径,或在同一目录文件udp_local.py会导致这样的错误。我最近argparse在尝试在这里回答问题时这样做了。

作为一个临时的解决方法,你可以尝试AF_INET = 2AF_INET = 1-它似乎是2在大多数地方,但可能是1在非Unix平台。