2016-04-28 6 views
2

コマンドラインからPythonのために配列を渡すどうやってのpythonに配列を渡すためにしようとしています

import sys 
arr = sys.argv[1] 
print(arr[2]) 

私のコマンドは

python3 test.py [1,2,3,4,5] 0 

が、私は結果を期待していること

2 

ただし、

, 
+0

別の類似の回答http://stackoverflow.com/questions/7605631/passing-a-list-to-python-from-command-line – mgilbert

+0

'[1,2,3,4,5]'はファイル名ですグロビングパターン。名前が1〜5またはカンマの1文字であるファイル名に一致します。 – Barmar

+0

スクリプトのリテラル引数として使用する場合は、引用符で囲む必要があります。 – Barmar

答えて

5

([3] ARR)argvの要素が文字列であるが、それらはプログラム中のリテラルのように解析されていません。

ちょうど(括弧なし)カンマで区切られた文字列を渡す必要があります。次に

python3 test.py 1,2,3,4,5 0 

アレイに変換するsplit()を使用します。

import sys 
arr = sys.argv[1].split(',') 
print(arr[2]) 
-1

あなたは間違ったインデックスを持って、3を試してみてください。 プリント

+2

'arr'は文字列であり、配列ではありません。インデックスを修正してもそれは修正されません。 – Barmar

4

コマンドライン引数は文字列です。整数から偶数を文字列からintに変換する必要があります。あなたの例に示すリスト構文を使用する場合は、ある種のパーサー(独自のパーサー、ast、またはevalから何かを実行する必要がありますが、evalは使用しないでください)。しかし、もっと簡単な方法があります:引数を別々に書いて、スライスをsys.argvとしてあなたのリストにしてください。複数の引数をコマンドラインプログラム(例えば、複数のファイル名をless,rmなど)に渡す標準的な方法は、スペースで区切られた引数です。

あなたは異なる目的(上記の例では -n)を持つ引数を識別し、スキップしたい
python3 test.py -n a b c 1 2 3 

まず、単に休息を保つ:

arr = sys.argv[2:] 
print(arr[3]) # Prints "1" 

PS。特別な意味を持つ文字(*;、引数の一部であるスペースなど)を引用することによって、シェルからの引数を保護する必要もあります。しかしそれは別の問題です。

+1

あなたは 'eval'を提案するためのダウンボトムを得るでしょう... – nekomatic

+0

まあ、私は正確ではありません...しかし、あなたは正しいです、警告のための感謝:-) – alexis

+1

@nekomaticそれはちょうど' evil' –

関連する問題