尝试打印lis时出现“值错误:关闭文件的I/O操作”

2024-05-21 01:50:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在网上找到了以下代码,添加了创建的列表并尝试打印长度

from __future__ import print_function
import socket
import struct
import sys
import os
import webbrowser
import json
import urllib

# We want unbuffered stdout so we can provide live feedback for
# each TTL. You could also use the "-u" flag to Python.

class flushfile(file):
    def __init__(self, f):
        self.f = f
    def write(self, x):
        self.f.write(x)
        self.f.flush()

sys.stdout = flushfile(sys.stdout)


def main(dest_name):
    dest_addr = socket.gethostbyname(dest_name)
    port = 33434
    max_hops = 30
    icmp = socket.getprotobyname('icmp')
    udp = socket.getprotobyname('udp')
    ttl = 1
    IPlist = []

    while True:
        recv_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
        send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp)
        send_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)

        # Build the GNU timeval struct (seconds, microseconds)
        timeout = struct.pack("ll", 5, 0)

        # Set the receive timeout so we behave more like regular traceroute
        recv_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, timeout)

        recv_socket.bind(("", port))
        sys.stdout.write(" %d  " % ttl)
        send_socket.sendto("", (dest_name, port))
        curr_addr = None
        curr_name = None
        finished = False
        tries = 1
        while not finished and tries > 0:
            try:
                _, curr_addr = recv_socket.recvfrom(512)
                finished = True
                curr_addr = curr_addr[0]
            except socket.error as (errno, errmsg):
                tries = tries - 1
                sys.stdout.write("* ")

        send_socket.close()
        recv_socket.close()

        if not finished:
            pass

        if curr_addr is not None:
            IPlist.append(curr_addr)
            print(len(IPlist))

        ttl += 1
        if curr_addr == dest_addr or ttl > max_hops:
            break

if __name__ == "__main__":
    main('google.com')

这是模拟traceroute功能的示例代码。在

我试图将(通过使用append)存储在curr_addr中的所有结果IP地址添加到一个列表中。我试着检查那一行的列表长度,以确保它继续增长。在

每次运行它,我都会遇到这样的错误:

^{pr2}$

请忽略上面的行号,因为我在发布之前删除了注释代码。在


Tags: nameimportselfsendstdoutsyssocketwrite
1条回答
网友
1楼 · 发布于 2024-05-21 01:50:05

您的flushfile类的问题并不奇怪。在

问题是flushfilefile继承,其closed属性默认为True。因此,当您尝试print()到{}时,它认为{}已经关闭。在

您有几种选择:

  1. 停止使用。如注释中所述,^{} function采用可选的flush参数。只需使用它:
 print("This will be flushed even without a newline", end=None, flush=True)
  1. flushfile基类从file更改为object正如我所说,file.closed属性默认为True,并且不能手动设置。从经验上讲,sys.stdout只有一个write方法就足够了,如果你只想print()的话。在

相关问题 更多 >