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