10 import concurrent.futures
17 Class for parallely downloading dependencies from download urls.
20 def __download_package(self, package_name: str, download_url: str,\
21 save_dir: str) -> str:
22 response = requests.get(download_url)
23 package_folder = os.path.join(save_dir, package_name)
24 if not os.path.exists(package_folder):
25 os.makedirs(package_folder)
27 match = re.search(
r'\.tar\.gz$|\.tar\.bz2$|\.tar\.xz$|\.zip$|\.whl$|\.tar$',\
29 file_extension = match.group(0)
if match
else os.path.splitext(download_url)[1]
30 file_path = os.path.join(package_folder, package_name + file_extension)
32 with open(file_path,
'wb')
as f:
33 f.write(response.content)
35 print(f
"Downloaded {package_name} to {file_path}")
38 if file_extension ==
".zip":
39 with zipfile.ZipFile(file_path,
'r')
as zip_ref:
40 zip_ref.extractall(package_folder)
41 elif file_extension
in [
".tar.gz",
".tgz",
".tar"]:
42 with tarfile.open(file_path,
'r:*')
as tar_ref:
43 tar_ref.extractall(package_folder)
45 print(f
"Unsupported file format: {file_extension}")
48 print(f
"Exported {package_name} to {package_folder}")
55 Download files concurrently from a list of urls
57 with concurrent.futures.ThreadPoolExecutor()
as executor:
60 for name, url
in download_list
63 for future
in concurrent.futures.as_completed(futures):
66 except Exception
as e:
67 print(f
"Error downloading package: {e}")
68 return f
"Packages downloaded in the folder {save_dir}"
def download_concurrently(self, list[tuple[str, str]] download_list, str save_dir)
str __download_package(self, str package_name, str download_url, str save_dir)