ユーザーが実行中に設定を変更した場合、変更した設定を適用するには再起動する必要があるPythonプログラムを作成しています。これを行う方法はありますか?私は次のようなことを考えています:
import sys
command_line = ' '.join(sys.argv)
# Now do something with command_line
# Now call my custom exit procedure
注:違いが生じる場合は、Windowsを使用しています
私はあなたが自分自身を再実行しようとすることから得る可能性のあるすべての不安を回避し、それを環境の手に委ねます。
つまり、私は意味します:
プログラムが特定の「再起動」コードで終了する間、ループ内で(指定されたのと同じパラメーターを使用して)プログラムを実行するだけの制御プログラムを用意します。これは、cmd
ファイルのように単純な場合もあれば、を使用する別の(非常に単純な)Pythonプログラムのように複雑な場合もありますos.system
。基本的に、制御プログラムがコード「restart」を取得する限り、まったく同じパラメータでプログラムを再実行します。他のコードがあると、そのコードで終了します。
完全に終了したい場合は、実際のPythonプログラムをリターンコード0(またはエラー状況での「再起動」コードではないもの)で終了させます。
プログラムの別のイテレーションに循環するだけの場合(たとえば、構成を再読み取りするため)、制御プログラムによって認識される「再起動」コードで終了します。
ただし、いつでも構成を再読み取りできるように、アプリケーションをリエンジニアリングすることも検討してください。これにより、問題全体が解消されます。それが選択肢ではない理由については言及されていないので、それが機能しない理由があると思います。
しかし、そうでない場合は、それが私が選択するパスです。
最初のオプションのサンプルコードを提供するには(これはWindows上にありますが、Cygwinの下にあります-同じ基本ルールがWindowsネイティブPythonに適用されますが、からの戻り値を確認する必要がありますos.system
)。
> cat phase1.py
#!/usr/bin/python
import os
status = 9
while status == 9:
status = int(os.system ("./phase2.py") / 256) # exit code is upper 8 bits
print "Controller: %d"%(status)
> cat phase2.py
#!/usr/bin/python
import sys
import time
time.sleep(1)
val = int(time.time())%10
if val == 0:
rc = 0
else:
rc = 9
print "Program: %d -> %d"%(val,rc)
sys.exit(rc)
> ./phase1.py
Program: 2 -> 9
Controller: 9
Program: 3 -> 9
Controller: 9
Program: 4 -> 9
Controller: 9
Program: 5 -> 9
Controller: 9
Program: 7 -> 9
Controller: 9
Program: 8 -> 9
Controller: 9
Program: 9 -> 9
Controller: 9
Program: 0 -> 0
Controller: 0
プログラムを再実行するかどうかを決定するために、終了コード9を使用してコントローラーを確認できます。プログラム自体は、10秒の倍数でない限り9を返すばかげたものです。
UNIXでは、os.execlファミリーの関数を使用できます。
これらの関数はすべて新しいプログラムを実行し、現在のプロセスを置き換えます。彼らは戻りません。Unixでは、新しい実行可能ファイルが現在のプロセスにロードされ、呼び出し元と同じプロセスIDを持ちます。エラーはOSError例外として報告されます。
Windowsで、UNIX呼び出しよりも効率が低いos.spawnlファミリを確認してください。