2012-07-04 277 views
14

私はいくつかのモジュールをロードするpythonベースのGTKアプリケーションを持っています。ユーザーが(Gitのを使用して)新しいバージョンをダウンロードすることができ、プログラム内から自分自身からpythonスクリプトを再起動

./myscript.py --some-flag setting

:それはそうのような(Linux)の端末から実行されます。 これが存在する/ダウンロードされている場合、新しくコンパイルされたコンテンツ(依存関係/インポートを含む)でプログラムを再起動したいというボタンが表示されます。好ましくは、すべてのフラグをそのまま維持するために、sys.argvの内容を使用して再起動することも好ましいでしょう。

私が見つけて/必要としないことは、プログラムの現在のインスタンスを強制終了させ、同じ引数を使用して新しいインスタンスを開始する素晴らしい再起動プロシージャです。

解決策はWindowsとMacでも有効ですが、必須ではありません。

+0

は、最初に古いものと並列に実行する新しいプロセスを持つことです。理論的には、新しいプロセスにプロセスのID(追加のコマンドラインオプションを使用)を与え、新しいプロセスIDが起動したら直ちに古いプロセスIDを削除することができます。 –

+0

[自己更新pythonスクリプトの再起動]の可能な複製(http://stackoverflow.com/questions/1750757/restarting-a-self-updating-python-script) –

答えて

24

あなたはos.exec*()を探しています。

+0

うわー!私はこれが可能であることを知らなかった。それを指摘してくれてありがとう! –

+2

これはpython 2.7.9で無効な構文エラーを表示します。 – clankill3r

2

UPDATE - いくつかの例で上記の回答の今後の参考のために

私はrunme.sh

#!/bin/bash 
kill -9 server.py 
python /home/sun/workspace/c/src/server.py & 

を持っていると私は、アプリケーション自体を再起動する必要があるので、私が持っていたserver.py持っている:

os.system('runme.sh') 

しかし、それはrunme.shに従うことでアプリケーション自体を再起動しなかったので、私がこの方法で使用したとき:

os.execl('runme.sh', '') 

その後、私は時々あなたがメモリの問題や同時接続を引き起こすことができる、あまりにも多くのオープンファイルオブジェクトと記述子で終わる可能性があり、私はこれは、より精巧な答えだと思う自体

14

を再起動することができましたネットワークデバイス。

import os 
import sys 
import psutil 
import logging 

def restart_program(): 
    """Restarts the current program, with file objects and descriptors 
     cleanup 
    """ 

    try: 
     p = psutil.Process(os.getpid()) 
     for handler in p.get_open_files() + p.connections(): 
      os.close(handler.fd) 
    except Exception, e: 
     logging.error(e) 

    python = sys.executable 
    os.execl(python, python, *sys.argv) 
0

私は、このソリューションは、あなたが求めているものは技術的ではありません知っているが、あなたはすべてを解放されたか、あなただけのからスクリプトを実行することができ、依存関係に依存したくない、100%を確認したい場合別のループ:

import os, time 

while 1: 
    os.system("python main.py") 
    print "Restarting..." 
    time.sleep(0.2) # 200ms to CTR+C twice 

その後、あなたは、単にとしてmain.py再起動することができます可能性がありますどのような

quit() 
関連する問題