我正在编写一个python脚本,它将作为user-data-script在EC2机器上运行。我试图找出如何升级机器上的包类似于bash命令:
$ sudo apt-get -qqy update && sudo apt-get -qqy upgrade
我知道我可以在python中使用apt
包来执行此操作:
import apt
cache=apt.Cache()
cache.update()
cache.open(None)
cache.upgrade()
cache.commit()
问题是如果python本身是升级的软件包之一会发生什么。有没有办法在升级后重新加载解释器和脚本,并在它停止的地方继续?
现在我唯一的选择是使用shell脚本作为我的用户数据脚本,其唯一目的是升级包(可能包括python),然后在我的其余代码中放入python。我想消除使用shell脚本的额外步骤。
答案 0 :(得分:0)
我想我明白了:
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()
答案 1 :(得分:0)
使用链接。
#!/bin/sh
cat >next.sh <<'THEEND'
#!/bin/sh
#this normally does nothing
THEEND
chmod +x next.sh
python dosomestuff.py
exec next.sh
在Python应用程序中,您可以编写一个shell脚本来执行您需要的操作。在这种情况下,该shell脚本将升级Python。由于它在Python关闭后运行,因此没有冲突。实际上,next.sh
可以启动相同(或另一个)Python应用程序。如果您在两个shell脚本first.sh
和next.sh
之间进行切换,则可以根据需要将这些调用链接在一起。