2

私はPythonで書かれたラッパースクリプトに取り組んでいます。ラッパーは、システム状態に基づいて別のPythonスクリプトを選択し、それを実行することになっています(絶対パスを使用)。親スクリプトに戻る必要はありません。

実行中のスクリプトを制御できないことに注意してください。__name__チェックとアクセスを使用できsys.argv、スクリプトが直接実行された場合と同じように動作するはずです。

現在、私は使用していos.execl()ます:

import os, sys

# ...

os.execl(sys.executable, sys.executable, new_script, *sys.argv[1:])

しかし、私はそれに関して少なくとも3つの問題を数えることができます:

  1. Pythonインタープリターに渡されたオプションは保持されません(たとえばpython -v wrapper、再実行時に冗長になるのをやめます)。
  2. Pythonインタープリターが不必要に再実行されます(PyPyを使用すると、システムに0,7が追加されます)。
  3. それは有用であることに依存しsys.executableており、ドキュメントは次のように述べています。

    Pythonが実行可能ファイルへの実際のパスを取得できない場合はsys.executable、空の文字列またはNone

os.execlすべての問題を解決するために、呼び出しに どの置換を使用する必要があるのか​​疑問に思っています。これまでのところ、私はそれを言うことができます:

  1. execfile()おそらく動作しますが、Python3で削除され、AFAICSを手動で再実装するのは醜いです(エンコーディングの問題のため)。他にどのような影響があるのか​​わかりませんexecfile()
  2. imp.load_module()おそらく動作しますが、少しハッキーで、Python3.3では非推奨になりました。おそらくPython3エンコーディングの問題も発生する可能性があります。

どのソリューションを使用することをお勧めしますか?


編集:私は忘れます。このソリューションは、Python 2.5以降、PyPy、およびJython2.5以降で動作する必要があります。

4

2 に答える 2

1

execfile()の代わりに使用しimp.load_module()ます。制御はエグゼクティブスクリプトに戻されますが、大きな利点の1つは、ドキュメントを引用することです。

これは、モジュール管理を使用しないという点でimportステートメントとは異なります。つまり、ファイルを無条件に読み取り、新しいモジュールを作成しません。

つまり、スクリプトファイルはどこにあってもかまいませんし、ファイル拡張子を付けても(または付けなくても)、モジュールインポート関連のタスクを実行するためにリソースが無駄になることはありません。

そうすることで、あなたが望むことを自動的に達成または回避します。

  1. インタプリタオプションは保持されます
  2. 通訳が不必要に再実行されることはありません
  3. の値に依存しませんsys.executable
于 2012-11-18T23:06:34.580 に答える
-1

このようなことを試しましたか?

### wrapped script ###

import sys

print("__name__: {0}\nsys.argv: {1}".format(__name__, sys.argv))
### wrapper script ###

import builtins, sys

my_script = "wrapped_script.py"

print("Executing the wrapped script...")

sys.argv[0] = my_script
with open(my_script, 'r') as fd:
    for line in fd:
        exec(line)

結果:

$ python3 wrapped_script.py --foo --bar=quux
__name__: __main__
sys.argv: ['wrapped_script.py', '--foo', '--bar=quux']

$ python3 wrapper.py --foo --bar=quux
Executing the wrapped script...
__name__: __main__
sys.argv: ['wrapped_script.py', '--foo', '--bar=quux']
于 2012-11-17T17:18:43.767 に答える