Обновите сам Python с помощью модуля apt - PullRequest
1 голос
/ 21 июля 2011

Я пишу скрипт на python, который будет работать на компьютере EC2 как user-data-script . Я пытаюсь выяснить, как я могу обновить пакеты на машине, аналогично команде bash:

$ sudo apt-get -qqy update && sudo apt-get -qqy upgrade

Я знаю, что могу использовать пакет apt в python для этого:

import apt
cache=apt.Cache()
cache.update()
cache.open(None)
cache.upgrade()
cache.commit()

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

Прямо сейчас мой единственный выбор - использовать сценарий оболочки в качестве сценария пользовательских данных с единственной целью обновления пакетов (включая, возможно, python), а затем перейти на python для остальной части моего кода. Я хотел бы исключить дополнительный шаг использования сценария оболочки.

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Использовать цепочки.

#!/bin/sh
cat >next.sh <<'THEEND'
#!/bin/sh
#this normally does nothing
THEEND
chmod +x next.sh

python dosomestuff.py

exec next.sh

Внутри приложения Python вы должны написать сценарий оболочки, чтобы сделать то, что вам нужно.В этом случае этот сценарий оболочки обновит Python.Поскольку он запускается после завершения работы Python, конфликта нет.Фактически, next.sh может запустить то же (или другое) приложение Python.Если вы переключаетесь между двумя сценариями оболочки first.sh и next.sh, вы можете объединить столько вызовов, сколько захотите.

0 голосов
/ 21 июля 2011

Кажется, я понял это:

def main():
    import argparse
    parser = argparse.ArgumentParser(description='user-data-script.py: initial python instance startup script')
    parser.add_argument('--skip-update', default=False, action='store_true', help='skip apt package updates')
    # parser.add_argument whatever else you need
    args = parser.parse_args()

    if not args.skip_update:
        # do update
        import apt
        cache = apt.Cache()
        cache.update()
        cache.open(None)
        cache.upgrade()
        cache.commit()

        # restart, and skip update
        import os, sys
        command = sys.argv[0]
        args = sys.argv
        if skipupdate:
            args += ['--skip-update']
        os.execv(command, args)

    else:
        # run your usual code
        pass

if __name__ == '__main__':
    main()
...