Я сделал простой код, который является одновременно программой для копирования файлов. Это не выдает ошибку выше, когда я работаю с Windows Env.Тем не менее, я сделал Docker-контейнер , который выполняет ubuntu , а также я работаю с моей директорией хоста, и она отлично работает, когда размер файла небольшой, но когда я тестирую файл, размер которого превышает 2 ГБ, он даетмне выше ошибка.Опять же, этот тест был в порядке, когда я работаю на Windows Pycharm.
import os
import queue
import time
import threading
class FileCopy(threading.Thread):
q = queue.Queue()
semaphore = 0
buffer_size = 1024*1024
def __init__(self, fileName, newFileName):
threading.Thread.__init__(self)
self.fileName = fileName
self.newFileName = newFileName
def run(self):
with open(fileName, 'rb') as src, open(newFileName, 'wb') as dst:
FileCopy.q.put((self, "start"))
FileCopy.write_log()
while True:
copy_buffer = src.read(FileCopy.buffer_size)
if not copy_buffer:
FileCopy.q.put((self, "complete"))
FileCopy.write_log()
break
dst.write(copy_buffer)
@classmethod
def write_log(cls):
while True:
if FileCopy.semaphore >= 1:
continue
else:
FileCopy.semaphore += 1
with open("log.txt", 'a') as f:
log, when = FileCopy.q.get()
msg = ""
if when == "start":
msg = "%.2f Start copying %s to %s\n" % (time.time()-start_time, log.fileName, log.newFileName)
elif when == "complete":
msg = "%.2f %s is copied completely\n" % (time.time()-start_time, log.newFileName)
f.write(msg)
FileCopy.semaphore -= 1
break
start_time = time.time()
while True:
fileName = input("Input the file name: ")
if os.path.exists(fileName):
newFileName = input("Input the new name: ")
copyThread = FileCopy(fileName, newFileName)
copyThread.start()
else:
print("no file")