关于python:如果参数传递给脚本,则跳过input()

skip input() if arguments are passed into script

我不能把这些都放在一起…在脚本的开头,我有一些用户输入以获取基本信息:

1
2
3
def get_provider():
    print("Operations are ...", conversion_type )
    conversion = input('Enter conversion ')

这(以及其他一些用户输入部分)是驱动脚本其余部分的原因。

我希望能够只传入变量,并使用argv设置变量,而不是使用用户输入部分。这更多是为了调试。不过,我不想取消用户输入部分。如果传入参数,则跳过。

我认为解决方案是围绕argv parse和if __name__ =="__main__": ...展开的,但正如我所说,我不能完全将它们放在一起。

下面是一个我尝试过但效果不太好的例子:

1
2
3
4
5
6
7
8
9
10
11
12
def get_provider():
    print("Operations are ...", conversion_types )
    conversion_type = input('Enter conversion ')
conversion_type = get_provider()

def main():
    conversion_type = sys.argv[0]

if __name__ == '__main__':
    main()

... the rest of the script...


下面是一个使用argparse的可选位置参数的示例。

此示例将使用命令行参数(如果给定)。否则将提示用户输入。不管怎样,conversion_type都会被填充。

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python3

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('conversion_type', nargs='?')
args = parser.parse_args()

if args.conversion_type:
    conversion_type = args.conversion_type
else:
    conversion_type = input('conversion_type: ')
print(conversion_type)

一个快速的黑客方法是检查argv的长度。如果长度大于1,那么您有len(sys.argv) - 1参数,因为第一个元素是文件名。假设您有一个数字作为输入。

如果使用python script.py运行脚本,此解决方案将起作用。如果你用的是更复杂的东西,要小心。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def get_provider():
    print("Operations are ...", conversion_types )
    conversion_type = input('Enter conversion ')

def main():
    if len(sys.argv) == 1:
        # only your file name
        conversion_type = get_provider()
    else:
        conversion_type = sys.argv[1]

if __name__ == '__main__':
    main()

... the rest of the script...

要获得更可持续的解决方案,请使用argparse库。这个答案可能会让你开始。


看一下模块sys

1
2
3
4
5
6
7
import sys

if len(sys.argv) > 1:  
    # There are arguments to the script
else:
    # There aren't arguments to the script
    # use input to take arguments