私はPythonで書かれたラッパースクリプトに取り組んでいます。ラッパーは、システム状態に基づいて別のPythonスクリプトを選択し、それを実行することになっています(絶対パスを使用)。親スクリプトに戻る必要はありません。
実行中のスクリプトを制御できないことに注意してください。__name__
チェックとアクセスを使用できsys.argv
、スクリプトが直接実行された場合と同じように動作するはずです。
現在、私は使用していos.execl()
ます:
import os, sys
# ...
os.execl(sys.executable, sys.executable, new_script, *sys.argv[1:])
しかし、私はそれに関して少なくとも3つの問題を数えることができます:
- Pythonインタープリターに渡されたオプションは保持されません(たとえば
python -v wrapper
、再実行時に冗長になるのをやめます)。 - Pythonインタープリターが不必要に再実行されます(PyPyを使用すると、システムに0,7が追加されます)。
- それは有用であることに依存し
sys.executable
ており、ドキュメントは次のように述べています。Pythonが実行可能ファイルへの実際のパスを取得できない場合は
sys.executable
、空の文字列またはNone
。
os.execl
すべての問題を解決するために、呼び出しに
どの置換を使用する必要があるのか疑問に思っています。これまでのところ、私はそれを言うことができます:
execfile()
おそらく動作しますが、Python3で削除され、AFAICSを手動で再実装するのは醜いです(エンコーディングの問題のため)。他にどのような影響があるのかわかりませんexecfile()
。imp.load_module()
おそらく動作しますが、少しハッキーで、Python3.3では非推奨になりました。おそらくPython3エンコーディングの問題も発生する可能性があります。
どのソリューションを使用することをお勧めしますか?
編集:私は忘れます。このソリューションは、Python 2.5以降、PyPy、およびJython2.5以降で動作する必要があります。