36

私は、ソケットタイムアウトを処理することを除いて、tryの使用方法を理解しようとしています。

from socket import *

def main():
    client_socket = socket(AF_INET,SOCK_DGRAM)
    client_socket.settimeout(1)
    server_host = 'localhost'
    server_port = 1234
    while(True):
        client_socket.sendto('Message',(server_host,server_port))
        try:
            reply, server_address_info = client_socket.recvfrom(1024)
            print reply
        except socket.Timeouterror:
            #more code

ソケットモジュールを追加する方法はすべてをインポートすることでしたが、ドキュメントで例外を処理するにはどうすればよいですか?socket.timeouterrorを使用できると書かれていますが、それは私には機能しません。また、実行した場合、try例外ブロックをどのように記述しimport socketますか?誰かが輸入品の違いを説明することもできますか?

4

4 に答える 4

50
from foo import * 

現在のモジュールに、先頭にアンダースコアを付けずにすべての名前(またはmodules__all__属性で定義された名前のみ)を追加しfooます。

上記のコードでは、現在の名前空間に プルしたときfrom socket import *にキャッチしたいだけです。timeouttimeout

from socket import *内部のすべての定義を取り込みますが、それ自体socketは追加しませんsocket

try:
    # socketstuff
except timeout:
    print 'caught a timeout'

多くの人がimport *問題があると考え、それを避けようとします。これは、この方法でインポートされた2つ以上のモジュールの共通変数名が互いに競合するためです。

たとえば、次の3つのPythonファイルについて考えてみます。

# a.py
def foo():
    print "this is a's foo function"

# b.py
def foo():
    print "this is b's foo function"

# yourcode.py
from a import *
from b import *
foo()

実行yourcode.pyすると、「これはbのfoo関数です」という出力だけが表示されます。

このため、モジュールをインポートして使用するか、モジュールから特定の名前をインポートすることをお勧めします。

たとえば、コードを明示的にインポートすると、次のようになります。

import socket
from socket import AF_INET, SOCK_DGRAM

def main():
    client_socket = socket.socket(AF_INET, SOCK_DGRAM)
    client_socket.settimeout(1)
    server_host = 'localhost'
    server_port = 1234
    while(True):
        client_socket.sendto('Message', (server_host, server_port))
        try:
            reply, server_address_info = client_socket.recvfrom(1024)
            print reply
        except socket.timeout:
            #more code

タイピングが少し増えましたが、すべてが明示的であり、すべてがどこから来ているのかは読者にはかなり明白です。

于 2012-08-08T13:50:16.260 に答える
15

私はcatchigsocket.timeoutsocket.error;だけで十分な成功を収めました。ただし、socket.errorはさまざまな理由で発生する可能性があります。気をつけて。

import socket
import logging

hostname='google.com'
port=443

try:
    sock = socket.create_connection((hostname, port), timeout=3)

except socket.timeout as err:
    logging.error(err)

except socket.error as err:
    logging.error(err)
于 2016-09-20T19:12:35.590 に答える
3

あなたがするとき、from socket import *Pythonはsocket現在の名前空間にモジュールをロードしています。したがって、モジュールのメンバーは、現在のpythonモジュール内で定義されているかのように使用できます。

これを行うimport socketと、モジュールは別の名前空間にロードされます。メンバーにアクセスするときは、メンバーの前にモジュール名を付ける必要があります。たとえば、socketクラスを参照する場合は、を記述する必要がありますclient_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

タイムアウトの問題については、クラスがモジュール内で定義されており、そのすべてのメンバーが名前空間にインポートされているため、に変更except socket.Timeouterror:するだけで済みます。except timeout:timeoutsocket

于 2012-08-08T13:50:01.750 に答える
3

これが私のプロジェクトの1つで使用しているソリューションです。

network_utils.telnet

import socket
from timeit import default_timer as timer

def telnet(hostname, port=23, timeout=1):
    start = timer()
    connection = socket.socket()
    connection.settimeout(timeout)
    try:
        connection.connect((hostname, port))
        end = timer()
        delta = end - start
    except (socket.timeout, socket.gaierror) as error:
        logger.debug('telnet error: ', error)
        delta = None
    finally:
        connection.close()

    return {
        hostname: delta
    }

テスト

def test_telnet_is_null_when_host_unreachable(self):
    hostname = 'unreachable'

    response = network_utils.telnet(hostname)

    self.assertDictEqual(response, {'unreachable': None})

def test_telnet_give_time_when_reachable(self):
    hostname = '127.0.0.1'

    response = network_utils.telnet(hostname, port=22)

    self.assertGreater(response[hostname], 0)
于 2016-08-19T10:14:54.880 に答える