Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在命令行中运行python3脚本_Python 3.x_Command Line_Argparse - Fatal编程技术网

Python 3.x 在命令行中运行python3脚本

Python 3.x 在命令行中运行python3脚本,python-3.x,command-line,argparse,Python 3.x,Command Line,Argparse,我用python编写了一个函数,它接受两个列表(长度相同),并返回另一个包含两个元素的列表。该函数工作得很好,但我正在尝试在命令行中运行python脚本。为此,我想在python中使用argparse模块。我使用以下命令在python3中编写了以下脚本: python3 text.py a b results 脚本应该采用3个参数,2个列表作为输入,1个列表作为输出。以下是脚本: def fun(a, b): a_is_greater = 0 b_is_greater = 0

我用python编写了一个函数,它接受两个列表(长度相同),并返回另一个包含两个元素的列表。该函数工作得很好,但我正在尝试在
命令行中运行python脚本。为此,我想在python中使用
argparse
模块。我使用以下命令在python3中编写了以下脚本:

python3 text.py a b results
脚本应该采用3个参数,2个列表作为输入,1个列表作为输出。以下是脚本:

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
def fun(a,b):
a_大于等于0
b_大于等于0
对于zip(a,b)中的元素a和元素b:
如果元素a>元素b:
a_大于+=1
elif元素a<元素b:
b_大于+=1
返回[a_大于,b_大于]
def main():
导入argparse
ap=argparse.ArgumentParser(description=”“)
ap.add_参数('--list type',type=list)
ap.add_参数('--list type',type=list)
ap.add_参数('-o','-outlist',required=True)
args=ap.parse_args()
结果=乐趣(a,b)
返回结果
如果名称=“\uuuuu main\uuuuuuuu”:
来自信号输入信号、信号管道、信号单元DFL
信号(信号管、信号灯)
尝试:
main()
除IOE错误外:
如果e.errno!=32:
提升
键盘中断除外,如e:
通过
你知道怎么修吗?我试过这两个列表:
a=[4,5,2]
b=[3,5,4]
。脚本中的fun函数非常适合这两种输入。

这样更好吗

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
代码:

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

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
def fun(a,b):
a_大于等于0
b_大于等于0
对于zip(a,b)中的元素a和元素b:
如果元素a>元素b:
a_大于+=1
elif元素a<元素b:
b_大于+=1
返回[a_大于,b_大于]
def main():
导入argparse
ap=argparse.ArgumentParser(description=”“)
ap.add_参数('--list1',type=list)
ap.add_参数('--list2',type=list)
ap.add_参数('-o','-outlist',required=True)
args=ap.parse_args()
结果=乐趣(args.list1,args.list2)
打印(结果)
返回结果
如果名称=“\uuuuu main\uuuuuuuu”:
来自信号输入信号、信号管道、信号单元DFL
信号(信号管、信号灯)
尝试:
main()
除IOE错误外:
如果e.errno!=32:
提升
键盘中断除外,如e:
通过

使用
type=list
更正代码后,
sys.argv
args
显示为:

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]'和'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]
现在,这两个输入是普通的整数列表,而不是包含方括号和逗号的字符列表。比较将是数字的,而不是词汇的