当前位置: 首页 > 知识库问答 >
问题:

ValueError:关闭文件时的I/O操作错误

戚飞雨
2023-03-14

我需要帮助,请我从2天前开始尝试解决此问题,但没有成功,我是python新手,请更改代码并解释:

这是它的代码和通过scapy的arp扫描程序。它从scapy扫描中获取结果,并将扫描结果(ip和macaddress)保存到linux机器中的txt文件中

然后运行一个外部python脚本,通过以下命令:os.system("pythondetect_doublepulsar_smb.py--filelast.txt")

最后的txt=文件包含scapy扫描结果的

但当扫描完成我得到了这个错误:

回溯(最后一次调用):文件“test.py”,第116行,lena=int(原始输入(“输入编号”))值错误:对关闭的文件执行I/O操作

这是完整的代码

logging.basicConfig(format='%(asctime)s %(levelname)-5s %(message)s',  datefmt='%Y-%m-%d %H:%M:%S', level=logging.DEBUG)
logger = logging.getLogger(__name__)


def long2net(arg):
if (arg <= 0 or arg >= 0xFFFFFFFF):
    raise ValueError("illegal netmask value", hex(arg))
return 32 - int(round(math.log(0xFFFFFFFF - arg, 2)))


def to_CIDR_notation(bytes_network, bytes_netmask):
network = scapy.utils.ltoa(bytes_network)
netmask = long2net(bytes_netmask)
net = "%s/%s" % (network, netmask)
if netmask < 16:
    logger.warn("%s is too big. skipping" % net)
    return None

return net


def scan_and_print_neighbors(net, interface, timeout=1):
logger.info("arping %s on %s" % (net, interface))
try:
    ans, unans = scapy.layers.l2.arping(net, iface=interface, timeout=timeout, verbose=True)
    for s, r in ans.res:
        line = r.sprintf("%Ether.src%  %ARP.psrc%")
        try:
            hostname = socket.gethostbyaddr(r.psrc)
            line += " " + hostname[0]
        except socket.herror:
            # failed to resolve
            pass
        logger.info(line)
except socket.error as e:
    if e.errno == errno.EPERM:     # Operation not permitted
        logger.error("%s. Did you run as root?", e.strerror)
    else:
        raise

while True:

lena = int(raw_input("Enter Number : "))
print(lena)


if __name__ == "__main__":
    import sys
    import os 
    import time


    sys.stdout = open('textout.txt', 'w+')

    if lena == 1:
        for network, netmask, _, interface, address in scapy.config.conf.route.routes:
            # skip loopback network and default gw
            if network == 0 or interface == 'lo' or address == '127.0.0.1' or address == '0.0.0.0':
                continue

            if netmask <= 0 or netmask == 0xFFFFFFFF:
                continue

        net = to_CIDR_notation(network, netmask)
        if interface != scapy.config.conf.iface:
            # see http://trac.secdev.org/scapy/ticket/537
            logger.warn("skipping %s because scapy currently doesn't support arping on non-primary network interfaces", net)

        if net:
            scan_and_print_neighbors(net, interface)

            sys.stdout.close()

            os.system("awk 'NR > 2 {print $2}' textout.txt > last.txt")

            os.system("python detect_doublepulsar_smb.py --file last.txt")


    elif lena == 3 :
        print("bye Bye")
        break

共有1个答案

柳志专
2023-03-14

问题是在您的代码中,它关闭了标准输出文件处理程序,但是稍后输入试图向它写入"Enter Number:"

    if net:
        scan_and_print_neighbors(net, interface)

        sys.stdout.close() # <<<

要快速修复,请将标准stdout保存在不同的变量中,然后在关闭后重定向到它。

if __name__ == "__main__":
    import sys
    import os 
    import time

    saved_stdout = sys.stdout
    sys.stdout = open('textout.txt', 'w+')

    ... 

    sys.stdout.close()
    sys.stdout = saved_stdout
 类似资料:
  • 问题内容: 这里,是一本字典,并且都是字符串。 当我尝试写入文件时,它报告错误: 问题答案: 正确缩进;您的陈述应在区块内: 在块外部,文件已关闭。

  • 当我运行我的代码时,我收到以下错误。 我正在运行的代码,如下所示: 它说错误在第41行,给出为 沟通电话有什么问题吗?

  • 我无法将单词打印到文件中。我的代码只是给我一个错误:

  • 我从Theano和Keras开始深入学习。但是,对于任何程序,我都必须加载数据集,而我无法加载任何数据集。 即使我运行这两行:- 我甚至用minst数据集尝试了上述方法。完全相同的错误。 我试着一个接一个地运行命令,第一次导入很顺利。在第二个命令中,它运行,python开始下载。然而,几秒钟后,它就断了。 这就是确切的错误:- (X_列,y_列),(X_测试,y_测试)=cifar10。load_

  • 有人能解释一下我的代码有什么问题吗?我得到以下错误: 回溯(最后一次调用): 文件“C:\LineRep.py”,模块中的第15行: 对于文件2中的行: 值错误:对关闭的文件执行I/O操作 我的代码:

  • 代码从卡中刮取单个事件,但我一直收到以下错误: C:\Python27\python.exeC:/用户/詹姆斯/PycharmProjects/剪贴画/scrapy.py回溯(最近的调用最后):文件"C:/用户/詹姆斯/PycharmProjects/剪贴画/scrapy.py",第31行,在writer.writerow(c)值错误: I/O关闭文件的操作 我正在使用pyCharm。 退出代码为