【问题标题】:python sockets on Mac OS X gives AttributeError: 'module' object has no attribute 'IF_INET'Mac OS X 上的 python 套接字给出 AttributeError: 'module' object has no attribute 'IF_INET'
【发布时间】:2011-07-27 04:52:03
【问题描述】:

我正在 Mac OS X 10.6 上尝试一些 python 网络编程。我正在使用 Homebrew 安装的 Python 2.7,并尝试从包含 UDP 客户端和服务器的Foundations Of Python Network Programming(顺便说一句很棒的书)运行一个简单的脚本,但是在尝试使用来自套接字模块的变量时出现上述 AttribuiteError .脚本如下:

#! /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

【问题讨论】:

  • 也许这是 Homebrew 的问题?
  • 也许吧,但是当我用 /usr/bin/python 尝试它时,我遇到了类似的问题。无论如何,我想我会尝试重新安装 Homebrew python 看看是否有帮助。
  • 这很奇怪。 dir(socket) 导入后显示什么?
  • 我将我的文件命名为socket.py。我的工作目录中有另一个socket.pyc 文件,该文件是我之前运行它时创建的。删除它解决了问题。

标签: python macos sockets udp homebrew


【解决方案1】:

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

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

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

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

【讨论】:

  • 这很可能是您所建议的文件名冲突(特别是如果它因/usr/bin/python2.6 而失败)或者可能是python 库的文件权限问题(您可以“导入_socket”吗)。无论如何,这在 OS X 上应该可以正常工作。
  • 您可以尝试使用 python.org 2.7.2 安装程序,而不是自己构建它(在此处使用 64 位/32 位安装程序:python.org/download
  • 与此有关。我正在工作的文件夹中有一个“socket.py”文件,该文件存在冲突。我删除了“socket.py”文件,但“socket.pyc”仍然存在。删除 .pyc 文件修复了它。奇怪的是,即使我在不​​同的文件夹中并且只是运行 python 命令提示符,这仍然会发生 - 即 socket.pyc 在 ~/test 中并且我从 ~/.知道为什么会发生这种情况吗?
  • 如果您运行的 Python 脚本在 ~/test 中,或者 ~/test 在 Python 的搜索路径中,就会发生这种情况。
猜你喜欢
  • 2015-09-26
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2021-07-25
  • 2014-12-20
  • 2022-12-01
  • 2012-02-29
相关资源
最近更新 更多