当我试图用Python在文件中写入数据时,文件有时是打开的,有时是关闭的

2024-06-08 02:10:25 发布

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

在主文件中,我调用以下函数将相同的数据写入二进制文件:

主.py

writeOutputFile(param1, param2, param3)

file_a.writeOutputFile中,我用with语句打开输出文件 并调用函数file_b.writeReference

文件\u a.py

@singleton
class BitstreamToFile:
    def __init__(self, outfile):
        self.outfile = outfile
        self.cache = ''

    def add(self, data, length):
        s = ''
        if (type(data) == str):
            log.info("string %s \n "%data)
            for char in data:
                b = bin(ord(char))[2:]
                s = s + "{:0>8}".format(b)
        else:
            s = bin(data)[2:]
            if (len(s) < length):
                resto = length - len(s)
                for _ in range(0, resto):
                    s = '0' + s
        s = s[0:length]
        self.cache = self.cache + s

        self.flush()

    def writeByteToFile(self):
        if (len(self.cache) < 8):
            raise ("Not enough bits to make a byte ")
        data = int(self.cache[:8], 2)
        log.info("writeByteToFile %s " % data)
        self.outfile.write(struct.pack('>B', data))
        self.cache = self.cache[8:]

    def flush(self, padding=False):
        while (len(self.cache) >= 8):
            log.info("BEF flush len(self.cache) %s"%len(self.cache))
            self.writeByteToFile()
            log.info("AFT flush len(self.cache) %s"%len(self.cache))

        if (padding):
            self.cache = "{:0<8}".format(self.cache)
            self.writeByteToFile()

def writeOutputFile(param1, param2, param3):
    [..]
    with open(OUTPUT_FILE, 'wb') as out_file:
       writeReference(out_file, param2, param1)

file_B.writeReference中,我实例化了我的BitstreamToFile对象

文件\u b.py

def writeReference(out_file, param2, param1):
    bitstream = file_a.BitstreamToFile(file)
    log.debug ("write key && length")
    bitstream.add("akey", 32)
    bitstream.add(0, 64)
    [..]

当我第一次编译和执行时,没有错误。第二次我得到:

# log from `file_B.writeReference`   
write key && length
# log from file_a.bitstream.flush
BEF flush len(self.cache) 32
#log from file_a.bitstream.writeByteToFile
writeByteToFile 114

然后代码崩溃:

Exception on /encode [POST]
[..]
File "/src/file_a.py", line 83, in flush
self.writeByteToFile()
File "/src/file_a.py", line 73, in writeByteToFile
self.outfile.write(struct.pack('>B', data))
ValueError: write to closed file
"POST /encode HTTP/1.1" 500 -

关于错误可能在哪里有什么提示吗?我真的不明白为什么它有时有效,有时无效。 先谢谢你


Tags: 文件pyselflogcachedatalendef
2条回答

不是答案。
诊断工具:
子类io.FileIO;重写添加日志的__enter____exit__方法,以便您可以看到上下文管理器何时进入和退出(文件关闭?)。也许可以向程序的其他部分添加更多日志,以获得更细粒度的时间历史。用一个假文件或者一些与真实文件隔离的东西来做一些测试运行(我这么说主要是因为我不知道使用子类的后果,所以你应该小心)。举个例子:

import io
class B(io.FileIO):
    def __enter__(self):
        print(f'\tcontext manager entry - file:{self.name}')
        return super().__enter__()
    def __exit__(self,*args,**kwargs):
        print(f'\tcontext manager exiting - file:{self.name}')
        super().__exit__(self,*args,**kwargs)

In [32]: with B('1.txt','wb') as f:
    ...:     f.write(b'222')
    ...:     
        context manager entry - file:1.txt
        context manager exiting - file:1.txt

In [33]: 

这个问题与docker容器有关,它处理我在上面共享的代码。 我是Docker的新手,所以我使用以下命令来构建容器(我有3个微服务):

$docker-compose up -d  build

如果没有重新创建容器(源代码中没有更改),那么第二次重新运行之前停止的容器时,我的文件最后关闭了。你知道吗

如果我强制重新创建容器(在不需要更改源代码的情况下):

$docker-compose up -d  build  force-recreate

我没有更多的错误。你知道吗

相关问题 更多 >

    热门问题