Python-сокеты в Mac OS X дают AttributeError: у объекта 'module' нет атрибута 'IF_INET' - PullRequest
2 голосов
/ 27 июля 2011

Я пробую программирование на Python для Mac OS X 10.6. Я использую Python 2.7, установленный Homebrew, и пытаюсь запустить простой скрипт из Основы сетевого программирования Python (отличная книга), который содержит UDP-клиент и сервер, но когда я получаю вышеупомянутую 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

1 Ответ

4 голосов
/ 27 июля 2011

Я взглянул на исходный код Python.На некоторых платформах AF_INET определяется в SOCKET.py или IN.py, который автоматически генерируется из /usr/include/sys/socket.h или чего-то подобного.

Я не мог на самом деле увидеть, где это было определено для OSX, ноВозможно, в вашей версии происходит что-то странное.

Наиболее вероятная проблема в том, что вы нарушили важное правило - никогда не называйте файл после модуля в стандартной библиотеке.Файл socket.py в вашем пути или в том же каталоге, что и udp_local.py, может вызвать такие ошибки.Я недавно сделал это с argparse, пытаясь ответить на вопрос здесь.

В качестве временного обходного пути вы можете попробовать AF_INET = 2 и AF_INET = 1 - в большинстве мест, похоже, 2, номожет быть 1 на не-Unix платформах.

...