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.