1

我正在编写一个 python 脚本,它将作为user-data-script在 EC2 机器上运行。我试图弄清楚如何升级机器上的软件包,类似于 bash 命令:

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

我知道我可以使用aptpython 中的包来执行此操作:

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

问题是如果 python 本身是升级的软件包之一会发生什么。有没有办法在此升级后重新加载解释器和脚本并从中断的地方继续?

现在我唯一的选择是使用 shell 脚本作为我的用户数据脚本,其唯一目的是升级包(可能包括 python),然后将其余代码放入 python 中。我想消除使用 shell 脚本的额外步骤。

4

2 回答 2

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()
于 2011-07-21T02:26:24.343 回答
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您可以将任意数量的这些调用链接在一起。

于 2011-07-21T04:54:16.177 回答