2

Python スクリプトに 4 つの引数を渡したいのですが、そのうちの 1 つはリストでなければなりません。要素が1つしか含まれていない場合でも。

引数の順序は重要ではありません。

    import sys
    print sys.argv

    one = sys.argv[1]
    two = sys.argv[2]
    three = sys.argv[3]
    four = sys.argv[4]

    print "one: " + one
    print "two: " + two
    print "three: "+ three
    print "four: " + four

このように呼んでいます。

    python myScript.py name file setting ['listItem1']

4 番目の項目は、1 つの要素を持つリストです。ただし、印刷すると表示されます

    four: [listItem1]

を見たいのですが

    four: ['listItem1']
4

4 に答える 4

7

おそらくより良い方法は、スクリプトを次のように呼び出すことです

python myScript.py name file setting listItem1 ...

次に、代わりにスライスを使用します。

four = sys.argv[4:]

これにより、Python 構文がシェルから除外されます。これは醜く、後でシェル内の特殊文字を使用してさらに多くの問題を引き起こす可能性があります。

さらに良い方法は、argparseモジュールを使用して適切な CLI を実装することです。

于 2013-01-22T15:46:21.100 に答える
2

PersonArtPhoto が指摘したように、シェルがそれら自体を使用しないようにするには、引用符をエスケープする必要があります。

プログラムで最終的に得られるのは、リストに似た文字列であり、これは望んでいるものではありません

import sys 

four = sys.argv[4]
print four[2]

ショー

$ python myscript.py one two three [\'first\',\'second\']
f

これは単なる文字列であるため'f'、インデックス作成から来ています"['first','second']"


Python にこれを解釈させる 1 つの方法は、非常に安全evalではないため、非常にお勧めできません。 文字列をコードとして解釈するため、ユーザー入力では使用しないでください。ユーザーは何でも入力でき、Python がそれを実行します。eval

import sys 

four = eval(sys.argv[4])
print four[1]

ショー

$ python myscript.py one two three [\'first\',\'second\']
second

代わりに、より安全なアプローチをお勧めします。コマンド ライン フラグを使用して、引数のリストを送信していることを知らせます。

import sys

# make sure the --args flag was passed
if '--args' not in sys.argv:
    print >> sys.stderr, 'Please pass the "--args" flag followed by a list of'\
            ' arguments'
    sys.exit(1) #terminate execution if it wasn't

four = sys.argv[sys.argv.index('--args')+1:] # everything passed after --args
print four

ショー

$ python myscript.py one two three --args 'first' 'second'
['first', 'second']

リストの前に常に3つの引数があることがわかっている場合は、単純にスライスを使用できます

import sys

one, two, three = sys.argv[1:4] # grab indicies 1, 2, and 3
four = sys.argv[4:]
print one
print two
print three
print four

ショー

$ python myscript.py one two three 'first' 'second'
one
two
three
['first', 'second']
于 2013-01-22T16:02:25.113 に答える
1

プログラム:

import sys, ast, getopt, types

def main(argv):            
    arg_dict={}
    switches={'li':list,'di':dict,'tu':tuple}
    singles=''.join([x[0]+':' for x in switches])
    long_form=[x+'=' for x in switches]
    d={x[0]+':':'--'+x for x in switches}
    try:            
        opts, args = getopt.getopt(argv, singles, long_form)
    except getopt.GetoptError:          
        print "bad arg"                       
        sys.exit(2)       

    for opt, arg in opts:        
        if opt[1]+':' in d: o=d[opt[1]+':'][2:]
        elif opt in d.values(): o=opt[2:]
        else: o =''
        print opt, arg,o
        if o and arg:
            arg_dict[o]=ast.literal_eval(arg)

        if not o or not isinstance(arg_dict[o], switches[o]):    
            print opt, arg, " Error: bad arg"
            sys.exit(2)                 

    for e in arg_dict:
        print e, arg_dict[e], type(arg_dict[e])        

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

コマンドライン:

python py.py --l='[1,2,3,[1,2,3]]' -d "{1:'one',2:'two',3:'three'}" --tu='(1,2,3)'

出力:

args:  ['--l=[1,2,3,[1,2,3]]', '-d', "{1:'one',2:'two',3:'three'}", '--tu=(1,2,3)']
tu (1, 2, 3) <type 'tuple'>
di {1: 'one', 2: 'two', 3: 'three'} <type 'dict'>
li [1, 2, 3, [1, 2, 3]] <type 'list'>

-lこのコードスニペットは、またはのような短いまたは長いコマンドスイッチを取り--li=、切り替え後のテキストをリスト、タプル、またはdictのようなPythonデータ構造に解析します。解析されたデータ構造は、長い形式のスイッチキーを使用して辞書に格納されます。

ast.literal_evalの使用は比較的安全です。Pythonデータ定義のみを解析できます。

于 2013-01-22T15:54:48.133 に答える
1

引用符をエスケープする必要があります

python myScript.py name file setting [\'listItem1\']
于 2013-01-22T15:43:08.303 に答える