本腳本通過訪問
http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu/pool/main/g/gcc-9/
來獲取要下載的內容。
目前只能在上面的網址下載gcc-9的deb包,可以下載指定Ubuntu版本和架構的gcc9組包。
如果你無法通過apt-get更新gcc,可以嘗試用此腳本下載包,然後在終端進入下載目錄,使用"sudo apt-get install *.deb"安裝指定包。
github:https://github.com/lindorx/get-gcc-9/
代碼:
import requests
import os
import hashlib
import re
import sys
import platform
import time
url ='http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu/pool/main/g/gcc-9/'
#下載函數
def downloader(url,filepath):
start=time.time()
size=0
file=requests.get(url,stream=True)
count=1024
content_size=int(file.headers['content-length'])
print('[ 地址 ]:'+url)
if file.status_code==200:
if content_size<1024: #字節 byte
print('[文件大小]:%0.2f byte'%(content_size))
elif content_size<1024*1024: #Kb
print('[文件大小]:%0.2f Kb'%(content_size/1024))
count=2048
else: #Mb
print('[文件大小]:%0.2f Mb'%(content_size/1024/1024))
count=2048
with open(filepath,'wb+')as f:
for data in file.iter_content(chunk_size=count):
f.write(data)
size+=len(data)
print('\r'+'[下載進度]:%s%0.2f%%'%('>'*int(size*50/content_size),float(size/content_size*100)),end='')
end=time.time()
print('[ 耗時 ]:%0.2f'%(end-start))
if __name__=='__main__':
#獲取系統架構
sysarch=platform.machine()
sysarch=sysarch.lower()
vermatch=r'href.*?cpp.*?\-doc_.*?ubuntu1~([\d|\.]*?)\_.*?.deb.*?'
if url[len(url)-1]=='/':
url=url[:-1]
new_md5=hashlib.md5()
new_md5.update(url.encode('utf8'))
urlhash=str(new_md5.hexdigest()) #計算網址哈希值
files=os.listdir('.') #獲取此目錄文件名
print('[獲取網頁]')
fae=False
for i in range(0,len(files)):
if files[i][:-4]==urlhash:
fae=True
break
if fae:#創建文件
print('[網頁已緩存,讀取]')
f=open(files[i],"r")
strhtml=f.read()
f.close()
else:
strhtml =requests.get(url)
strhtml=strhtml.text
#將網頁寫入文件
f=open(urlhash+'.txt','w+')
f.write(strhtml)
f.close()
print('[讀取網頁成功]')
#讀取支持的版本
uvs=re.findall(vermatch,strhtml)
if uvs==None:
print('!獲取版本信息錯誤,請檢查正則表達式vermatch或'+urlhash+'.txt文件內的網頁緩存')
sys.exit()
print('*'*50)
for ver in uvs:
print(ver)
print('*'*50)
vercheck=input('*上面是支持的Ubuntu版本,請輸入對應的版本號:')
isinarray=False
for ver in uvs:
if ver==vercheck:
isinarray=True
break
if not isinarray:
print('!輸入版本不支持')
sys.exit()
archmatch=r'href.*?gcc.*?base.*?ubuntu1~'+vercheck+r'\_([\S]*?)\.deb'
#讀取支持的架構
uas=re.findall(archmatch,strhtml)
check=input('*本機系統架構爲:'+sysarch+',手動選擇?(n/y):')
if check!='':
if check[0]=='y' or check=='Y':
for arch in uas:
print(arch)
archeck=input('*上面是PPA中Ubuntu-'+vercheck+'支持的架構,輸入對應架構:')
else:
archeck=sysarch
isinarry=False
for arch in uas:
if arch==archeck:
isinarray=True
break
if not isinarray:
print('架構不支持')
sys.exit()
filematch=r'href.*?"(.*?ubuntu1~'+vercheck+r'_'+archeck+r'\.deb)"'
fname=re.findall(filematch,strhtml)#匹配文件名
print('[完成文件名查找,開始寫入文件]')
#將讀取的文件名寫入文件
fnamelen=len(fname) #文件數量
filename=urlhash+'_files.txt'
f=open(filename,'w+')
f.write('file num:'+str(fnamelen)+'\n')
for line in fname:
f.write(line+'\n')
f.close()
print('[文件名已寫入文件]:'+filename)
print('[共 '+str(fnamelen)+' 個文件]')
#開始根據文件名下載文件
check=input('*是否開始下載文件?(n/y):')
if check!='':
if check[0]!='y' and check[0]!='Y':
sys.exit()
else:
sys.exit()
#創建文件夾
dire=re.search(r'[^/]*$',url) #根據網址的匹配出文件夾名
if dire==None:
print('!文件夾名出錯')
sys.exit()
dire=str(dire.group())
print('[下載目錄]:'+dire)
isexists=os.path.exists(dire)
if not isexists:
os.mkdir(dire)
dire=dire+'\\'
for i in range(0,fnamelen):
print('[開始下載]:'+fname[i])
downloader(url+'/'+fname[i],fname[i])
print('[下載完成]\n[剩餘]:%d/%d'% (fnamelen-i-1,fnamelen))