113

Python には、いくつかの関数を定義するモジュールmyModule.py と、いくつかのコマンド ライン引数を取るmain()があります。

私は通常、bash スクリプトからこの main() を呼び出します。今、すべてを小さなパッケージに入れたいので、単純な bash スクリプトを Python スクリプトに変換してパッケージに入れることができないかと考えました。

では、MyFormerBashScript.pyの main() 関数から myModule.pyのmain() 関数を実際に呼び出すにはどうすればよいでしょうか。私もそれを行うことができますか?引数を渡すにはどうすればよいですか?

4

7 に答える 7

139

それはただの機能です。それをインポートして呼び出します:

import myModule

myModule.main()

引数を解析する必要がある場合は、次の 2 つのオプションがあります。

  • でそれらを解析しますが、パラメーターとしてmain()渡しsys.argvます (以下のすべてのコードは同じモジュール内にありますmyModule):

    def main(args):
        # parse arguments using optparse or argparse or what have you
    
    if __name__ == '__main__':
        import sys
        main(sys.argv[1:])
    

    myModule.main(['arg1', 'arg2', 'arg3'])これで、他の別のモジュールからインポートして呼び出すことができます。

  • main()すでに解析されているパラメーターを受け入れます (モジュール内のすべてのコード) myModule:

    def main(foo, bar, baz='spam'):
        # run with already parsed arguments
    
    if __name__ == '__main__':
        import sys
        # parse sys.argv[1:] using optparse or argparse or what have you
        main(foovalue, barvalue, **dictofoptions)
    

    他の場所でインポートして呼び出しmyModule.main(foovalue, barvalue, baz='ham')、必要に応じて Python 引数を渡します。

ここでの秘訣は、モジュールがスクリプトとして使用されていることを検出することです。python filename.pyPython ファイルをメイン スクリプト ( )として実行すると、importステートメントは使用されないため、python はそのモジュールを呼び出します"__main__"。しかし、同じfilename.pyコードがモジュール ( ) として扱われる場合import filename、python は代わりにそれをモジュール名として使用します。どちらの場合も、変数__name__が設定されており、それに対してテストすると、コードがどのように実行されたかがわかります。

于 2013-01-24T11:26:23.580 に答える
32

場合によります。メイン コードがifas によって保護されている場合:

if __name__ == '__main__':
    ...main code...

いいえ、自動変数に影響を与えることができないため、Pythonにそれを実行させることはできません__name__

しかし、すべてのコードが関数内にある場合は、できる可能性があります。試す

import myModule

myModule.main()

これは、モジュールが__all__.

from myModule import *表示されない可能性がmainあるため、モジュール自体をインポートする必要があります。

于 2013-01-24T11:30:55.573 に答える
3

私も同じ必要がありargparseました。問題はparse_args、オブジェクト インスタンスの関数であり、argparse.ArgumentParserデフォルトで から引数を暗黙的に受け取りますsys.args。Martijn 行に従う回避策は、それを明示的にすることで構成されているため、渡す引数を必要に応じて変更できますparse_args

def main(args):
    # some stuff
    parser = argparse.ArgumentParser()
    # some other stuff
    parsed_args = parser.parse_args(args)
    # more stuff with the args

if __name__ == '__main__':
    import sys
    main(sys.argv[1:])

重要なポイントは、args をparse_args関数に渡すことです。後で、メインを使用するには、Martijn の指示に従ってください。

于 2014-12-03T11:53:15.190 に答える
0

コマンドライン引数も渡そうとしていると仮定します。

import sys
import myModule


def main():
    # this will just pass all of the system arguments as is
    myModule.main(*sys.argv)

    # all the argv but the script name
    myModule.main(*sys.argv[1:])
于 2013-01-24T11:31:09.550 に答える