2

我想将 4 个参数传递给我的 python 脚本,其中一个必须是列表。即使它只包含 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']

其中第四项是具有一个元素的列表。但是,当我打印它时,我看到

    four: [listItem1]

我想看看

    four: ['listItem1']
4

4 回答 4

7

也许更好的方法是调用你的脚本

python myScript.py name file setting listItem1 ...

然后使用切片代替:

four = sys.argv[4:]

这将 python 语法排除在 shell 之外,这很丑陋,并且可能会在以后使用 shell 中的特殊字符导致更多麻烦。

更好的方法是使用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 解释这一点的一种方法是eval,但它非常不安全,因为它非常不安全eval将字符串解释为代码,因此不应在用户输入中使用它,因为用户可以输入任何内容,python 将执行它。

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']

如果您知道列表之前总会有三个参数,您可以简单地使用切片

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

你需要转义引号

python myScript.py name file setting [\'listItem1\']
于 2013-01-22T15:43:08.303 回答
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'>

此代码片段将采用短或长命令切换,如-lor--li=并将切换后的文本解析为 Python 数据结构,如列表、元组或字典。解析后的数据结构最终出现在带有长格式开关键的字典中。

使用ast.literal_eval相对安全。它只能解析python数据定义。

于 2013-01-22T15:54:48.133 回答