2016-10-25 4 views
0

私はPythonスクリプトscript_Aを持っていて、そのmainには別のファイルの別のpython関数を呼び出します。pythonスクリプトのすべての引数を関数に伝播する最良の方法

script_Aは、以下のように呼び出されます:私が持っている

script_A --option1 "foo" --option2 "hoo" 

script_A内部:私は実際に引数を解析せずにfunc_Bscript_Aに渡されるすべての引数を渡したい

if __name__ == "__main__": 
    # call another function `func_B` defined in a different file 

つまり、​​をfunc_Bの内部に使用したいと考えています。

これを行うにはどのような方法が最適ですか?

+0

'argparse'はデフォルトで' sys.argv'を解析します。これは呼び出しスタックのどこからでも利用できます。ちょうどそれを直接調べる 'import sys'です。 – hpaulj

答えて

1

組み込みモジュールsysを使用して引数リストを取得します。その後、あなたがしたいことをします。

import sys 

print(sys.argv) 
0

空白によって分割(最初の項目は、スクリプトの名前です)(sys.argv)リストにあなたの引数を取得するとすぐ、あなたのスクリプトが実行されると、あなたはつもりだ、ということを覚えておいてください、「あなたはとても初期の文字列を "それ自体"にすることはありません。これを考慮して

は、しかし、あなたはこのような何かを行うことができます:

mod1.py

import sys 
from mod2 import foo 


if __name__ == "__main__": 
    foo(sys.argv[1:]) # To remove the script's name, which is always the first argument 

そして

は、このようなファイルで__main__を持っています別のモジュール(この例では私はmod2.pyと呼んでいました)のargparserを次のように実行してください:

mod2.py

import argparse 


def make_parser(): 
    parser = argparse.ArgumentParser(description='Process some foos.') 
    parser.add_argument('--foo', type=str, nargs='+', help='a foo',) 
    parser.add_argument('--baz', type=str, help='a baz') 
    return parser 


def foo(args): 
    parser = make_parser() 
    parsed_args = parser.parse_args(args) 
    print "Got me some foos: %s" % (parsed_args.foo) 
    print "And a baz: %s" % (parsed_args.baz) 

$ python ./mod1.py --foo bar1 bar2 --baz 1がにつながる実行:ちょうどあなたがscript_Aからそれを使用しているだろう正確な方法func_Bで​​を使用

$ python ./mod1.py --foo bar1 bar2 --baz 1 
Got me some foos: ['bar1', 'bar2'] 
And a baz: 1 
+0

sys.argv [1:]は常に有効ですか? 引数がない場合、例外がスローされる可能性はありますか? 私は引数なしで試してみましたが、それは問題ありませんでしたが、確かめたいと思いました。 – sh0731

+0

コマンドラインから呼び出す限り、そうです。引数を渡さなくても、常に1つ(スクリプトの名前)が存在します。自分で試すことができます: 'foo(sys.argv [1:])'(または 'if __name__ ==" __main __ ":'の直後)の呼び出しの前に行内に 'print sys.argv'を追加し、少し **:-)** – BorrajaX

0

。それは正常に動作します。​​のようなコマンドライン引数とコマンドライン引数解析ツールは、あなたがどのファイルに入っているか気にしません。

関連する問題