使用apt模块更新python本身

时间:2011-07-21 01:46:18

标签: python amazon-ec2 apt user-data

我正在编写一个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脚本的额外步骤。

2 个答案:

答案 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.shnext.sh之间进行切换,则可以根据需要将这些调用链接在一起。