2017-04-12 21 views
3

のpythonファイルに引数を渡します:はどのように繰り返し、私は次のように実行されるPythonスクリプトを持って

name1 
name2 
name3 
name4 
... 
... 
name1000 

私はこれらの名前を引数として渡すためにpythonスクリプトを実行したいと考えています。

python script.py -n name1 
python script.py -n name2 
python script.py -n name3 
python script.py -n name4 
........ 
........ 
python script.py -n name1000 

を、私はsh run.shとして、このシェルスクリプトを実行します。この作業を行うための非常識ともっとも怠慢な方法は、私は次のようにrun.shを言う(私はこのコンテンツを生成するPythonスクリプトを書いた)シェルスクリプトを作成したことです。

私は、これを行うよりスマートでエレガントな方法が必要であると確信しています。任意のヒント?

また、それは各実行後に(クリア)

+0

は、なぜあなたは '使用しますあなたが '' python'をすでに持っているときに '' sh'を実行しますか? –

答えて

1

あなたはシェルスクリプトで次の操作を行うことができます名前のリストを持って考える:

awk '{ system("python script.py -n "$0) }' filename 
+0

「awk''の優雅さとシンプルさを思い出してくれてありがとう。この方法は、どこでも窒息することなく仕事をします。受け入れられる! – kingmakerking

0

試しPythonのメモリを解放することが可能である:...「のpython script.pyをラップしようとしていない場合は、それを行う必要があります

cat <file_with_list_of_names_1_per_line> | xargs python script.py -n 

を-n "をbashスクリプトで使用します。シンプルなもの、含んでいるでしょう「call_my_script.sh」という名前のスクリプトを言わせて:

#!/bin/bash 
python script.py -n $1 

、その後、あなたがそれを呼び出すことができます。あなたはまたの「-P」オプションを使用することができ

cat <file_with_list_of_names_1_per_line> | xargs call_my_script.sh 
# this will call/execute "call_my_script.sh name", for each name in the file, 1 at a time 

並行して複数のインスタンスを実行する「xargsの」、(同じ出力ファイルまたは同様に書き込むように、奇妙な結果を生み出すことができ、リソースへのconcurenţialのアクセスに注意)

.. | xargs -P <n> ... 

は、スクリップのインスタンスを実行する「N」にしますトン並列

サイドノートで:「xargsの」に慣れていない人のためにも重要な側面、それはライン上で2(またはそれ以上)があっただろう場合を意味し、各単語個別を扱います単語 "word1 word2" ...それは "スクリプト"を2回以上(各単語につき1回)呼び出すことになります。期待される行動ではないかもしれないので、言及する価値があります。

+0

'' 'python script.py -n $ 1'''はどうしますか、それをどうすれば実行できますか? – kingmakerking

+0

コメントはコードスニペットを許可しないので、元の回答を編集しました –

+0

UUOCアワードから自分自身を守り、 'cat file | xargs python ...'の代わりに ' liborm

2

シェルから呼び出されたときに、ファイルの場所(例:'names.txt')をパラメータとしてPythonスクリプトに渡すことをお勧めします。その後、Pythonスクリプト内で、名前をインポートして、それらを1つずつ処理します。あなたはPARAM nameをとる(例えばscript_functionと呼ばれる)の関数でscript.pyのロジックをラップし、'names.txt'に各nameためscript_function(name)を呼び出した場合、あなたがダウンして使用し、あなたの記憶を維持する必要があり、あなたの2番目の質問に

、。その理由は、script_functionで作成されたすべての変数が、その関数呼び出しに対してローカルであり、次の関数呼び出しで削除され/置き換えられ、次の名前で処理されるためです。

+0

あなたは正しいと思いますが、質問は[XYの問題です。](https://meta.stackexchange.com/a/66378) –

0

別の方法としては、awkの内のシステム機能に組み込まれているので、

list="name1 name2 name 3 ... name1000" 
for i in $list; do 
python script.py -n $i 
done 
関連する問題