4

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
4

1 に答える 1

6

Pythonのソースを見てみました。一部のプラットフォームでは、 はまたはでAF_INET定義され、またはから自動的に生成されます。SOCKET.pyIN.py/usr/include/sys/socket.h

これが OSX 用に定義されている場所を実際に確認できませんでしたが、お使いのバージョンで何か奇妙なことが起こっている可能性があります。

最も可能性の高い問題は、重要なルールを破ったことです。標準ライブラリのモジュールの後にファイル名を付けないでください。あなたのsocket.pyパスまたは同じディレクトリにファイルがあると、udp_local.pyこのようなエラーが発生します。argparseここで質問に答えようとしているときに、最近これを行いました。

一時的な回避策として、試しAF_INET = 2てみることができますAF_INET = 1--2ほとんどの場所にあるようですが1、Unix 以外のプラットフォームにある可能性があります。

于 2011-07-27T05:46:15.673 に答える