Хром Сборка Загрузчик


Поняв, что я тратил много времени на получение последней версии Хрома, я решил бросить вместе быстрый скрипт. С течением времени, я хотел сделать скрипт более эффективным, чище, и обновления. Вот что я придумал:

from zipfile import ZipFile
from os import rename, remove, path
from shutil import rmtree, copytree
from httplib2 import Http
from sys import argv, exit
from easygui import indexbox


h = Http('.cache')
saveDir = 'C:\\Program Files\\Chromium\\'

def getLatestVersion():
    verSite = ('http://build.chromium.org/f/chromium/snapshots/' +
            'Win/LATEST')
    re, ver = h.request(verSite)
    ver = str(ver, encoding='utf8')
    return ver


def delCurrent():
    try:
        rmtree(path.join(saveDir, 'Current'))
    except Exception:
        print('Chromium could not be removed.')


def delBackup():
    try:
        rmtree(path.join(saveDir, 'Backup'))
    except Exception:
        print('Backup could not be removed.')


def downloadChromium(ver):
    site = ('http://build.chromium.org/buildbot/snapshots/Win/'
            + ver + '/chrome-win32.zip')
    re, chrome = h.request(site)
    file = open(path.join(saveDir, 'latest.zip'), 'wb')
    file.write(chrome)
    file.close()


def unzip():
    zip = ZipFile(saveDir + 'latest.zip', 'r')
    zip.extractall(saveDir)
    rename(path.join(saveDir, 'chrome-win32'), path.join(saveDir, 'Current'))
    zip.close()
    remove(path.join(saveDir, 'latest.zip'))


def revert():
    delCurrent()
    copytree(path.join(saveDir, 'Backup'), path.join(saveDir, 'Current'))


def backup():
    delBackup()
    copytree(path.join(saveDir, 'Current'), path.join(saveDir, 'Backup'))


def gui():
    ver = getLatestVersion()
    choices = ['Download version %s' % ver, 'Backup', 'Revert', 'Exit']
    choice = indexbox('What do you want to do?',
            'Chromium Downloader', choices)
    if choice == 0:
        delCurrent()
        downloadChromium(ver)
        unzip()
    elif choice == 1:
        backup()
    elif choice == 2:
        revert()
    elif choice == 3:
        exit()
    gui()


def usage():
    print('-h         Display help text\n' +
          '-g         Launches the GUI Program\n' +
          '-v         Only gets the version\n' +
          '-r         Reverts to last backup\n' +
          '-b         Saves a new backup\n' +
          '-o         Specify version to download\n')


def main():
    if '-g' in argv:
        gui()
        exit()
    elif '-h' in argv:
        usage()
        exit(2)
    elif '-r' in argv:
        revert()
        exit()

    if '-o' in argv:
        ver = argv.index('-o') + 1
    else:
        ver = getLatestVersion()
        print('Latest Version: ', ver)
    if '-v' in argv:
        exit()

    delCurrent()
    downloadChromium(ver)
    unzip()

    if '-b' in argv:
        backup()

if __name__ == "__main__":
    main()

Есть какие-то главные вещи, которые должны быть изменены, чтобы сделать этот код лучше?



378
2
задан 26 июня 2011 в 07:06 Источник Поделиться
Комментарии
3 ответа

Я предполагаю, что вам известны хром Канари, который я собираю, может использовать бинарные дельты? Я не думаю, что это хоть и чистого хрома.

Ваш код довольно чистый. Вы могли бы использовать argparse для разбора командной строки, в настоящее время вы игнорируете флаги, которые не совпадают. Вы могли бы обернуть покинуть позвоните по основной, так: "выход" (функции main())и использовать возвращение / возвращение 2 заявления вместо. Вы могли бы заменить "C:\\Program файлы" с %PROGRAMFILES%, или забрать некоторые значения из реестра, но это не обязательно, если вы не планируете для более широкой аудитории. Вы также можете уменьшить окно хрома недоступен распакуйте куда-нибудь, потом каталоги, потом сняв предыдущий (но я не думаю, что вы можете сделать это без атомной что-то вроде символических или жестких ссылок).

2
ответ дан 26 июня 2011 в 10:06 Источник Поделиться

from zipfile import ZipFile
from os import rename, remove, path
from shutil import rmtree, copytree
from httplib2 import Http
from sys import argv, exit
from easygui import indexbox

Его личных предпочтений, но я предлагаю не используя импорт из X Y, если вы повторно использовать импортное название. Например, можно использовать только zip-файл один раз. Я бы предпочел импортировать zip-файл и затем использовать zip-файл.Zip-файл для одного occourance. Я думаю, что это делает код немного чище.

h = Http('.cache')

ч не очень описательное имя. Я рекомендую выбрать что-то, что дает лучшее представление о том, что происходит.

saveDir = 'C:\\Program Files\\Chromium\\'

Руководство по стилю Python рекомендует, что написано заглавными_буквами для глобальных констант

def getLatestVersion():

Руководство по стилю Python рекомендует lowercase_with_underscores для глобальных имен функций

    verSite = ('http://build.chromium.org/f/chromium/snapshots/' +
'Win/LATEST')

Если URL-адрес является достаточно долго, чтобы требовать разрыва на несколько строк, его, вероятно, достаточно долго, чтобы перейти в глобальной константы. Кроме того, почему ты конкатенации двух постоянных строк?

    re, ver = h.request(verSite)

Я не знал, что вновь и ver являются.

    ver = str(ver, encoding='utf8')

Вер строку? Почему не использует метод декодирования?

    return ver

Не присвоить значение в локальной переменной, а затем вернуть его. Просто вернуть его.

def delCurrent():
try:
rmtree(path.join(saveDir, 'Current'))
except Exception:
print('Chromium could not be removed.')

Во-первых, вы ловите все исключения. Это особенно плохо в Python, так что все может быть исключением. Его лучше ловить только те исключения, вы на самом деле ожидать. Во-вторых, вы попробуйте продолжить после сбоя. Если вы не можете удалить текущую версию, вы, вероятно, следует прервать, а не пытаться Блант на. В-третьих, не отображать любую информацию о том, что произошло. Исключением могут содержать полезную информацию о том, почему он не мог удалить файлы.

def delBackup():
try:
rmtree(path.join(saveDir, 'Backup'))
except Exception:
print('Backup could not be removed.')

def downloadChromium(ver):
site = ('http://build.chromium.org/buildbot/snapshots/Win/'
+ ver + '/chrome-win32.zip')

Я использовать строку форматирования строки бы сделать это лучше.

    re, chrome = h.request(site)
file = open(path.join(saveDir, 'latest.zip'), 'wb')
file.write(chrome)
file.close()

Ли API, который вы используете поддержку загрузки в файл? Если zip-файл очень большой, загрузив его в строковую переменную не может быть хороший план.

def unzip():
zip = ZipFile(saveDir + 'latest.zip', 'r')
zip.extractall(saveDir)
rename(path.join(saveDir, 'chrome-win32'), path.join(saveDir, 'Current'))
zip.close()
remove(path.join(saveDir, 'latest.zip'))

def revert():
delCurrent()
copytree(path.join(saveDir, 'Backup'), path.join(saveDir, 'Current'))

def backup():
delBackup()
copytree(path.join(saveDir, 'Current'), path.join(saveDir, 'Backup'))

def gui():
ver = getLatestVersion()
choices = ['Download version %s' % ver, 'Backup', 'Revert', 'Exit']
choice = indexbox('What do you want to do?',
'Chromium Downloader', choices)
if choice == 0:
delCurrent()
downloadChromium(ver)
unzip()

Я рекомендую переместить это в функцию, чтобы соответствовать другие варианты.

    elif choice == 1:
backup()
elif choice == 2:
revert()
elif choice == 3:
exit()

Я бы поставил все эти функции в список, а затем индексировать их.

    gui()

Не использовать рекурсию, использовать в то время как истинная петля.

def usage():
print('-h Display help text\n' +
'-g Launches the GUI Program\n' +
'-v Only gets the version\n' +
'-r Reverts to last backup\n' +
'-b Saves a new backup\n' +
'-o Specify version to download\n')

def main():

Я предлагаю проходящий в argv к главному. Вот кстати еще один кусок кода может вести этот код путем передачи аргументов в основной.

    if '-g' in argv:
gui()
exit()
elif '-h' in argv:
usage()
exit(2)
elif '-r' in argv:
revert()
exit()

if '-o' in argv:
ver = argv.index('-o') + 1
else:
ver = getLatestVersion()
print('Latest Version: ', ver)
if '-v' in argv:
exit()

Используя выход, чтобы избежать следующих больше логики считается плохим тоном. Используйте еще заблокировать.

    delCurrent()
downloadChromium(ver)
unzip()

if '-b' in argv:
backup()

if __name__ == "__main__":
main()

1
ответ дан 27 июня 2011 в 11:06 Источник Поделиться

Некоторые заметки:


  • В Python 2, файл -это встроенная функция, чтобы избежать использования имени для чего-либо еще. Более серьезным является молния, так как это все-таки встроенная функция в Python 3.

  • Воспользоваться с заявлением:

    # old
    file = open(path.join(saveDir, 'latest.zip'), 'wb')
    file.write(chrome)
    file.close()

    # new
    with open(path.join(saveDir, 'latest.zip'), 'wb') as f:
    f.write(chrome)

    То же самое касается zip-файл.

    Преимущество, помимо краткости, это, что независимо от того, что происходит, то файл всегда будет закрыт.


  • Использовать строку форматирования только при необходимости:

    # old
    'Download version ' + ver

    # new
    'Download version %s' % ver

    если вы настаиваете на использовании форматирование строк, использовать новую форму:

    'Download version {}'.format(ver)

0
ответ дан 27 июня 2011 в 09:06 Источник Поделиться