在命令行中运行python3脚本

时间:2019-06-10 18:04:56

标签: python-3.x command-line argparse

我用python编写了一个函数,该函数采用2 lists(具有相同的长度)并返回另一个包含2个元素的列表。该功能运行正常,但我正在尝试在command line中运行python脚本。为此,我想在python中使用argparse模块。我使用以下命令在python3中编写了以下脚本:

python3 text.py a b results

该脚本应使用3个参数2个列表作为输入,一个列表作为输出。这是脚本:

def fun(a, b):
    a_is_greater = 0
    b_is_greater = 0
    for element_a, element_b in zip(a, b):
        if element_a > element_b:
            a_is_greater += 1
        elif element_a < element_b:
            b_is_greater += 1
    return [a_is_greater, b_is_greater]


def main():
    import argparse
    ap = argparse.ArgumentParser(description="")
    ap.add_argument('--list-type', type=list)
    ap.add_argument('--list-type', type=list)
    ap.add_argument('-o', '--outlist', required=True)

    args = ap.parse_args()

    results = fun(a, b)
    return results

if __name__ == "__main__":
    from signal import signal, SIGPIPE, SIG_DFL
    signal(SIGPIPE, SIG_DFL)

    try:
        main()
    except IOError as e:
        if e.errno != 32:
            raise
    except KeyboardInterrupt as e:
        pass

您知道如何解决吗?我已经尝试了以下两个列表:a = [4, 5, 2]b = [3, 5, 4]。脚本中的fun函数对于这2个输入非常有效。

2 个答案:

答案 0 :(得分:1)

这样好吗?

import errors from './middleware/errorMiddleware'; ... // your middlewares ... app.use(errors);

python3 text.py --list1 [4,5,2] --list2 [3,5,4] -o result  # [1, 1]

代码:

def main():
    import argparse

    ap = argparse.ArgumentParser(description="")
    ap.add_argument('--list1', type=list)
    ap.add_argument('--list2', type=list)
    ap.add_argument('-o', '--outlist', required=True)
    args = ap.parse_args()

    results = fun(args.list1, args.list2)
    print(results)
    return results

答案 1 :(得分:0)

使用type=listsys.argvargs的更正代码显示为:

1353:~/mypy$ python3 stack56531390.py --list1 [4,5,2] --list2 [3,5,4] -o result
['stack56531390.py', '--list1', '[4,5,2]', '--list2', '[3,5,4]', '-o', 'result']
Namespace(list1=['[', '4', ',', '5', ',', '2', ']'], list2=['[', '3', ',', '5', ',', '4', ']'], outlist='result')
[1, 1]

请注意,“列表”以字符串形式出现。 list函数将该字符串分成一个字符列表。

In [607]: list('astring')                                                                              
Out[607]: ['a', 's', 't', 'r', 'i', 'n', 'g']

fun用于这些输入的事实更多是巧合,而不是设计使然。输入的内容与测试的a = [4, 5, 2]' and 'b = [3, 5, 4]不符。

看看如果用户在列表中放置空格会发生什么情况

1355:~/mypy$ python3 stack56531390.py --list1 [4, 5, 2] --list2 [3,5,4] -o result
usage: stack56531390.py [-h] [--list1 LIST1] [--list2 LIST2] -o OUTLIST
stack56531390.py: error: unrecognized arguments: 5, 2]

或用引号将空格隔开的列表连在一起:

1357:~/mypy$ python3 stack56531390.py --list1 "[4, 5, 2]" --list2 [3,5,4] -o result
['stack56531390.py', '--list1', '[4, 5, 2]', '--list2', '[3,5,4]', '-o', 'result']
Namespace(list1=['[', '4', ',', ' ', '5', ',', ' ', '2', ']'], list2=['[', '3', ',', '5', ',', '4', ']'], outlist='result')
[2, 3]

因此,虽然可以使type=list正常工作,但这通常不是一个好选择。请记住,argparse type是一个给定字符串的函数。它不是类型或类说明符。

如果我将两个参数更改为采用int类型的*输入,则

ap.add_argument('--list1', nargs='*', type=int)
ap.add_argument('--list2', nargs='*', type=int)

1358:~/mypy$ python3 stack56531390.py --list1 4 5 2  --list2 3 5 4 -o result
['stack56531390.py', '--list1', '4', '5', '2', '--list2', '3', '5', '4', '-o', 'result']
Namespace(list1=[4, 5, 2], list2=[3, 5, 4], outlist='result')
[1, 1]

现在,两个输入是普通的整数列表,而不是包含方括号和逗号的那些字符列表。比较将是数字形式,而不是词汇形式。

相关问题