11

現在を使用している別のPythonスクリプトを呼び出しているラッパーPythonスクリプトがありますos.system('python another.py some-params')

両方のスクリプトをデバッグできるようにする必要があります。使用するos.system()場合はデバッガーが失われるため、別のスクリプトを開始する代わりに、同じインタープリターを使用して2番目のスクリプトをロードすることは理にかなっています。

importを実行しないため、期待どおりにはなりません__main__

パラメータを見逃すためのexec()またはrunpyシームのような他のバリアント。argv

この問題に対してどのような解決策がありますか?

another.pyスクリプトを変更する必要のない解決策を探しています。sys.argvおそらく、これを実行する前に変更する必要があります。

4

4 に答える 4

9

これまでのところ、Python 2.7以降でのみ機能するソリューションを見つけました(runpy.run_path()はPython 2.7で導入されました)。

2.6(または2.5)で動作するものを見つけた場合は、投稿してください。

import runpy, sys
saved_argv = sys.argv
... # patch sys.argv[1:] and load new command line parameters
# run_path() does change only sys.argv[0] but restores it
runpy.run_path('another.py', run_name="__main__")
sys.argv = saved_argv # restore sys.argv
于 2010-09-07T13:19:53.767 に答える
2

あなたはコントロールできますanother.pyか?それを変更してmain()メソッドを追加することをお勧めします。Main()その後、呼び出すことができますif __name__ == '__main__'。これにより、問題が大幅に軽減されます。ユニットテストにも適しています。

于 2010-09-07T10:59:57.237 に答える
2

EOLから受け取った推奨事項に基づいて、execfile()制限を解決するための拡張を行いましたexecfile2()

以下はコードですが、新しいバージョンはここで公開されます。との下位互換性がありexecfile()ます。

def execfile2(filename, _globals=dict(), _locals=dict(), cmd=None, quiet=False):
    _globals['__name__']='__main__'
    saved_argv = sys.argv # we save sys.argv
    if cmd:
    sys.argv=list([filename])
            if isinstance(cmd , list):
                sys.argv.append(cmd)
            else:
                sys.argv.extend(shlex.split(cmd))
    exit_code = 0
try:
        execfile(filename, _globals, _locals)
    except SystemExit as e:
        if isinstance(e.code , int):
            exit_code = e.code # this could be 0 if you do sys.exit(0)
        else:
            exit_code = 1
    except Exception:
        if not quiet:
            import traceback
            traceback.print_exc(file=sys.stderr)
        exit_code = 1
    finally:
        if cmd:
            sys.argv = saved_argv # we restore sys.argv
    return exit_code
于 2010-09-09T11:48:29.107 に答える
1

メインブロックに関数を呼び出させることができます。このようにして、モジュールとしてインポートするときに同じ関数を呼び出すことができます。

def main():
    print "All start up commands"

if __name__ == "__main__":
    main()
于 2010-09-07T11:01:03.847 に答える