Обновите сам Python с помощью модуля apt

Я пишу скрипт Python, который будет работать на компьютере EC2 как скрипт пользовательских данных. Я пытаюсь выяснить, как я могу обновить пакеты на компьютере, аналогично команде 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 ответа

Решение

Я думаю, я понял это:

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

Используйте цепочку.

#!/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 Вы можете связать столько этих вызовов вместе, сколько захотите.

Другие вопросы по тегам