I have this code
import threading
import os
import py7zr
from py7zr import FILTER_LZMA2, FILTER_CRYPTO_AES256_SHA256, FILTER_DELTA, PRESET_DEFAULT
class My_Thread(threading.Thread):
`` def init(self, name, Archive, CheminSource, Root, Label, Objet):
`` `` threading.Thread.init(self)
`` `` self.name = name
`` `` self.Archive = Archive
`` `` self.CheminSource = CheminSource
`` `` self.Root = Root
`` `` self.Label = Label
`` `` self.Objet = Objet
`` def run(self):
`` `` ZipArchiveAtome(self.Archive, self.CheminSource, self.Root, self.Label, self.Objet)
def ZipArchiveAtome(Archive, CheminSource, Root, Label, Objet):
`` TbleTemp = CheminSource.split("\")
`` lgCheminSource = len(TbleTemp)
`` if (TbleTemp[lgCheminSource - 1] == ""):
`` `` lgCheminSource = lgCheminSource - 1
`` TbleTemp = Root.split("\")
`` lgRoot = len(TbleTemp)
`` if (TbleTemp[lgRoot - 1] == ""):
`` `` lgRoot = lgRoot - 1
`` Chaine = "\".join(TbleTemp[lgCheminSource:lgRoot])
`` Chemin01 = os.path.join(Root,Objet)
`` Chemin02 = os.path.join(Label,Chaine,Objet)
`` Archive.write(Chemin01, Chemin02)
def LanceThreads():
`` if len(TbleThreads) < MaxThreads:
`` `` return(True)
`` i0 = 1
`` for Item in TbleThreads:
`` `` if not Item.is_alive():
`` `` `` del TbleThreads[i0:i0+1]
`` `` `` return(True)
`` `` else:
`` `` `` i0 = i0 + 1
`` return(False)
def CreationThreads(Archive, CheminSource, root, RepRacine, Objet):
`` while not LanceThreads():
`` `` continue
`` Thread = My_Thread(Objet, Archive, CheminSource, root, RepRacine, Objet)
`` Thread.start()
`` TbleThreads.append(Thread)
filter = [{'id': FILTER_DELTA}, {'id': FILTER_LZMA2, 'preset': PRESET_DEFAULT}]
Target = r'D:\Test-7z-01.7z'
CheminSource = r'D:\Test'
RepRacine = r'Test'
TbleThreads = []
MaxThreads = 16
with py7zr.SevenZipFile(Target, mode='w', filters=filter, blocksize=10485760) as Archive:
`` for (root, dirs, files) in os.walk(CheminSource):
`` `` for dir in dirs:
`` `` `` CreationThreads(Archive, CheminSource, root, RepRacine, dir)
`` `` for file in files:
`` `` `` CreationThreads(Archive, CheminSource, root, RepRacine, file)
`` for Item in TbleThreads:
Item.join()
and when I run it, I have this error :
Exception in thread Test-03.py:
Traceback (most recent call last):
File "A:\01) - System\Python\Python - 3.10\lib\threading.py", line 1016, in _bootstrap_inner
self.run()
File "d:\Test-19.py", line 25, in run
ZipArchiveAtome(self.Archive, self.CheminSource, self.Root, self.Label, self.Objet)
File "d:\Test-19.py", line 64, in ZipArchiveAtome
Archive.write(Chemin01, Chemin02)
File "A:\01) - System\Python\Python - 3.10\lib\site-packages\py7zr\py7zr.py", line 1010, in write
folder = self.header.initialize()
AttributeError: 'SevenZipFile' object has no attribute 'header'
Test I have done :
When I bypass the multithreading, it's OK.
when I use the multithreading but in the "run" def I call my def it's ok like
def run(self): Test(self.Archive, self.CheminSource, self.Root, self.Label, self.Objet)
def Test(Archive, CheminSource, Root, Label, Objet): print("Chemin Source : ", CheminSource) print("Root : ", Root)
i wonder if the multithreading and py7zr are compatible.
Questions :
-
- Is my code correct ?
-
- Is py7zr compatible with the multithreading when you want to create the archive ?
Thanks in advance for your answers.