使用python寫的gcc下載腳本

本腳本通過訪問

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))



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章