2017-11-15 21 views
1

コマンドライン引数を実行するファイル 'train.py'があります。いくつかの議論が必要であり、いくつかは任意である。スクリプトからコマンドライン引数をPythonファイルに渡す方法

たとえば、

.\train.py --counter arg1 --opt optional_arg 

今、私はこの「train.py」をインポートして、そのスクリプトでargumetsを渡し、スクリプトの中で「train.py」を実行します「script.py」と呼ばれる新しいファイルを書きたいと思います。 py '

私はtrain.pyに毎回異なる引数のセットを与えたいので、これを行う必要があります。

シェルスクリプトを使用してこれを行うことができます。私はpythonスクリプトを使用してそれを行う方法について興味があります。

train.py

import optparse 
optparser = optparse.OptionParser() 

optparser.add_option(
    "--counter", default = "", 
    help = "Counter value" 
) 

optparser.add_option(
    "--opt", default = "", 
    help = "Optinal parameter" 
) 

'''Do Something''' 

script.py

args = { 
    '--counter':'' 
    '--opts':'' 
} 

lst = [ 1, 2, 3] 

for counter in lst: 
    '''set command line arguments here in args dictionary''' 
    args['--counter'] = counter 

    '''run train.py with args as input dictionary''' 
+3

あなたが求めていることは可能ですが、私はコマンドラインargsとしてPythonコードの異なる部分の間でデータを渡さないことをお勧めします。その代わりに、あるスクリプトの機能を関数またはクラスにラップし、他のスクリプトにインポートします。あなたがスクリプトとしてファイルを使い続けることができるようにしたいなら、 '' if __name__ == "__main __" 'idiom –

+0

***を使うことができます。*** Pythonコードの間でデータを渡すことはお勧めしません。 ***。これの背後にある理由? –

+0

データをコマンドラインargsとして渡すには、そのデータを文字列としてエンコードする必要があります。これは現在のデザインでは問題ないかもしれませんが、データが単純な場合はすぐに面倒になることがあります。最終的には、データを直接文字列に変換して元の型に戻すのは、それを直接渡すオプションがある場合は、少し無意味(非効率的)です。 –

答えて

3

一つのアプローチは、関数としてtrain.pyでアクションを定義するには、次のようになります。同じファイルで、ここから

def train(counter, opt=None): 
    '''Do Something''' 

、あなたはmainのチェックとは、との機能を実行することができますコマンドライン引数。

if __name__ == '__main__': 
    import optparse 
    optparser = optparse.OptionParser() 

    optparser.add_option(
     "--counter", default = "", 
     help = "Counter value" 
    ) 

    optparser.add_option(
     "--opt", default = "", 
     help = "Optional parameter" 
    ) 

    train(counter, opt) 

は、今あなたが他のあらゆるPythonパッケージとしてコールとtrain機能をインポートすることができます。ファイルが同じディレクトリにあると仮定すると、それはのようになります:

from train import train 

args = { 
    '--counter':'' 
    '--opts':'' 
} 

lst = [ 1, 2, 3] 

for counter in lst: 
    '''set command line arguments here in args dictionary''' 
    kwargs['--counter'] = counter # changed to kwargs from OP's args 
            # for the sake of accurate nomenclature 
    train(**kwargs) 

キー値は、その値は、関数のパラメータの名前と一致している文字列である場合**と辞書を開梱するだけで動作しますのでご注意ください。

をコマンドスクリプトとは別に実行することも、osの仲介なしでPythonプログラムから実行することもできます。

2

一つの方法は、Pythonを介しosモジュールとコマンドラインを使用することである。

script.py

import os 

# define some args 
arg1 = '74.2' 
optional_arg = 'disable' 

os.system("python train.py --counter" + arg1 + "--opt" + optional_arg) 
+0

私はそれがos.systemに文字列を渡しているので動作しないと思います。私はarg1をカウンタ値に置き換えるかどうかについて懐疑的です。私が間違っているなら、私を訂正してください。助けてくれてありがとうbtw :) –

+0

彼は非常に簡単な例を使用しました。あなたはこのメソッドを使うことができます。何らかの方法で文字列に変数を注入するだけです。異なる連結メソッドと相対速度については、[この回答](https://stackoverflow.com/a/43213810/2000793)を参照してください。 –

+0

@ ParshuramThorat引数がどのように変数になるかをより明確にするために私の答えを編集しました – collector

0

使用https://docs.python.org/2/library/argparse.html

argparseモジュールは、ユーザーフレンドリーなコマンドライン・インタフェースを記述することが容易になります。プログラムは必要な引数を定義し、argparseはそれらをsys.argvから解析する方法を理解します。また、argparseモジュールは、ユーザーがプログラムに無効な引数を渡すと自動的にヘルプと使用法のメッセージを生成し、エラーを発行します。

関連する問題