1

EC2マシンでuser-data-scriptとして実行されるPythonスクリプトを作成しています。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自体がアップグレードされたパッケージの1つである場合にどうなるかです。このアップグレードの後に​​インタプリタとスクリプトをリロードして、中断したところから続行する方法はありますか?

今のところ、私の唯一の選択肢は、パッケージ(Pythonを含む可能性があります)をアップグレードし、残りのコードをPythonにドロップすることを唯一の目的として、ユーザーデータスクリプトとしてシェルスクリプトを使用することです。シェルスクリプトを使用する余分な手順を削除したいと思います。

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アプリ内で、必要なことを実行するためのシェルスクリプトを記述します。この場合、そのシェルスクリプトはPythonをアップグレードします。Pythonがシャットダウンした後に実行されるため、競合は発生しません。実際、next.sh同じ(または別の)Pythonアプリを起動できます。first.sh2つのシェルスクリプトを交互に使用next.shし、これらの呼び出しを必要な数だけ連鎖させることができます。

于 2011-07-21T04:54:16.177 に答える