2011-07-21 11 views
1

私はuser-data-scriptとしてEC2マシン上で動作するpythonスクリプトを書いています。私はbashのコマンドに似マシン上でパッケージをアップグレードする方法を把握しようとしている:aptモジュールを使ってpython自体を更新してください

$ 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自体がアップグレードされたパッケージの1つであった場合に起こります。このアップグレードに続いてインタプリタとスクリプトをリロードし、途中で中断しないところで続ける方法はありますか?

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

答えて

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() 
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アプリケーションを起動できます。 2つのシェルスクリプトfirst.shnext.shの間で交互に実行すると、これらの呼び出しを必要に応じて連鎖させることができます。

+0

これはうまくいきますが、送信したり書き込んだりするスクリプトの数を減らすために、理想的には単一のPythonスクリプトにするのが理想的です。 – vsekhar

関連する問題