
[英]Sometimes when i try download file to ftp I get error: 550 Access is denied. But sometimes all is work
[英]File is sometimes open, sometimes closed when I try to write data in it in Python
在我的主文件中,我调用以下 function 将相同的数据写入二进制文件:
主文件
writeOutputFile(param1, param2, param3)
在file_a.writeOutputFile
我在 with 语句中打开我的 output 文件并调用 function file_b.writeReference
:
文件_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
object
文件_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 -
关于错误可能在哪里的任何提示? 我真的不明白为什么有时它会起作用,有时却不起作用。 先感谢您
不是答案。
诊断工具:
子类io.FileIO
; 覆盖__enter__
和__exit__
方法添加日志记录,以便您可以看到上下文管理器何时进入和退出(文件关闭?)。 也许将更多日志记录添加到程序的其他部分以获得更细粒度的 time-history 。 使用假文件或什至与您的真实文件更隔离的东西进行一些测试运行(我这么说主要是因为我不知道使用子类的后果,所以您应该小心)。 这是一个例子:
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
我没有更多的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.