运行 python 带有一些可选参数的脚本
Run python script with some of the argument that are optional
我已经阅读了 sys
文档,但仍有一些我不清楚的地方。我在 Whosebug 上寻找过一些类似的问题,但我没有找到任何有用的东西(显然任何参考都值得赞赏!)。
我想创建一个脚本 - 比如 foo.py
- 我想在其中传递 3 到 6 个参数:
$ python foo.py arg1 arg2 arg3
无论如何都必须给出前3个参数;最后 3 个参数在函数中使用,如果未传递任何参数,则该函数具有默认参数值。
问题是我该怎么做?到目前为止,我正在考虑编写类似以下内容的内容 foo.py
(这是一个简单的示例集,目的只是为了提供具体的内容来支持我的问题):
import sys
def example(credit_mom, credit_dad, debt_mom, debt_dad = 1000,
salary = 2000, bonus = 0):
total_gain = salary + credit_dad + credit_mom + bonus
total_loss = debt_dad + debt_mom
return total_gain - total_loss
if __name__ == '__main__':
if len(sys.argv) < 4:
sys.exit('Need at least 3 arguments. The order is as follows:\n\
1.credit_mom;\n\
2.credit_dad;\n\
3.debt_mom;\n\
4.others')
else:
sys.exit(example(sys.argv[1],
sys.argv[2],
sys.argv[3],
sys.argv[4],
sys.argv[5],
sys.argv[6]))
如果我 运行 这个脚本我显然得到一个 IndexError
异常:
$ python foo.py 110 110 220
Traceback (most recent call last):
File "foo.py", line 19, in <module>
sys.argv[4],
IndexError: list index out of range
除了使用 argparse
(我确实推荐)之外,这可以通过切片和扩展来解决:
sys.exit(example(*sys.argv[1:7]))
切片将只包含实际存在的元素,即使没有足够的元素来满足请求的切片大小。
使用 Argparse
我建议你使用 argparse (and here is the tutorial)。省去了手动检查参数是否存在的麻烦。此外,argparse 为您提供 --help
参数作为免费赠品,它将读取为每个参数定义的 help=""
字符串(如果提供)。
示例程序
在您的情况下,您有三个强制性(位置)参数和三个可选参数。示例 argparse 代码如下所示:
#!/usr/bin/python
# coding: utf-8
import argparse
def parseArguments():
# Create argument parser
parser = argparse.ArgumentParser()
# Positional mandatory arguments
parser.add_argument("creditMom", help="Credit mom.", type=float)
parser.add_argument("creditDad", help="Credit dad.", type=float)
parser.add_argument("debtMom", help="Debt mom.", type=float)
# Optional arguments
parser.add_argument("-dD", "--debtDad", help="Debt dad.", type=float, default=1000.)
parser.add_argument("-s", "--salary", help="Debt dad.", type=float, default=2000.)
parser.add_argument("-b", "--bonus", help="Debt dad.", type=float, default=0.)
# Print version
parser.add_argument("--version", action="version", version='%(prog)s - Version 1.0')
# Parse arguments
args = parser.parse_args()
return args
def example(credit_mom, credit_dad, debt_mom, debt_dad = 1000, salary = 2000, bonus = 0):
total_gain = salary + credit_dad + credit_mom + bonus
total_loss = debt_dad + debt_mom
return total_gain - total_loss
if __name__ == '__main__':
# Parse the arguments
args = parseArguments()
# Raw print arguments
print("You are running the script with arguments: ")
for a in args.__dict__:
print(str(a) + ": " + str(args.__dict__[a]))
# Run function
print(example(args.creditMom, args.creditDad, args.debtMom, args.debtDad, args.salary, args.bonus))
你的函数 "example" 很好。问题是您正在尝试读取不存在的系统参数。尝试检查它们是否为空(在 else 子句中)。
虽然我赞同 argparse
方法,但这里有一个快速而肮脏的方法:
arg1, arg2, arg3 = [None, False, []]
if sys.argv[1:]: # test if there are atleast 1 argument (beyond [0])
arg1 = sys.argv[1]
if sys.argv[2:]:
arg2 = sys.argv[2] # careful 'True' is a string, not a boolean
arg3 = sys.argv[3:] # rest
大多数情况下,我在开始向脚本添加参数解析时使用它,而我对参数的选择还没有成熟。它比 'optionals' 更适合 'positionals'(使用 argparse 术语)。
我已经阅读了 sys
文档,但仍有一些我不清楚的地方。我在 Whosebug 上寻找过一些类似的问题,但我没有找到任何有用的东西(显然任何参考都值得赞赏!)。
我想创建一个脚本 - 比如 foo.py
- 我想在其中传递 3 到 6 个参数:
$ python foo.py arg1 arg2 arg3
无论如何都必须给出前3个参数;最后 3 个参数在函数中使用,如果未传递任何参数,则该函数具有默认参数值。
问题是我该怎么做?到目前为止,我正在考虑编写类似以下内容的内容 foo.py
(这是一个简单的示例集,目的只是为了提供具体的内容来支持我的问题):
import sys
def example(credit_mom, credit_dad, debt_mom, debt_dad = 1000,
salary = 2000, bonus = 0):
total_gain = salary + credit_dad + credit_mom + bonus
total_loss = debt_dad + debt_mom
return total_gain - total_loss
if __name__ == '__main__':
if len(sys.argv) < 4:
sys.exit('Need at least 3 arguments. The order is as follows:\n\
1.credit_mom;\n\
2.credit_dad;\n\
3.debt_mom;\n\
4.others')
else:
sys.exit(example(sys.argv[1],
sys.argv[2],
sys.argv[3],
sys.argv[4],
sys.argv[5],
sys.argv[6]))
如果我 运行 这个脚本我显然得到一个 IndexError
异常:
$ python foo.py 110 110 220
Traceback (most recent call last):
File "foo.py", line 19, in <module>
sys.argv[4],
IndexError: list index out of range
除了使用 argparse
(我确实推荐)之外,这可以通过切片和扩展来解决:
sys.exit(example(*sys.argv[1:7]))
切片将只包含实际存在的元素,即使没有足够的元素来满足请求的切片大小。
使用 Argparse
我建议你使用 argparse (and here is the tutorial)。省去了手动检查参数是否存在的麻烦。此外,argparse 为您提供 --help
参数作为免费赠品,它将读取为每个参数定义的 help=""
字符串(如果提供)。
示例程序
在您的情况下,您有三个强制性(位置)参数和三个可选参数。示例 argparse 代码如下所示:
#!/usr/bin/python
# coding: utf-8
import argparse
def parseArguments():
# Create argument parser
parser = argparse.ArgumentParser()
# Positional mandatory arguments
parser.add_argument("creditMom", help="Credit mom.", type=float)
parser.add_argument("creditDad", help="Credit dad.", type=float)
parser.add_argument("debtMom", help="Debt mom.", type=float)
# Optional arguments
parser.add_argument("-dD", "--debtDad", help="Debt dad.", type=float, default=1000.)
parser.add_argument("-s", "--salary", help="Debt dad.", type=float, default=2000.)
parser.add_argument("-b", "--bonus", help="Debt dad.", type=float, default=0.)
# Print version
parser.add_argument("--version", action="version", version='%(prog)s - Version 1.0')
# Parse arguments
args = parser.parse_args()
return args
def example(credit_mom, credit_dad, debt_mom, debt_dad = 1000, salary = 2000, bonus = 0):
total_gain = salary + credit_dad + credit_mom + bonus
total_loss = debt_dad + debt_mom
return total_gain - total_loss
if __name__ == '__main__':
# Parse the arguments
args = parseArguments()
# Raw print arguments
print("You are running the script with arguments: ")
for a in args.__dict__:
print(str(a) + ": " + str(args.__dict__[a]))
# Run function
print(example(args.creditMom, args.creditDad, args.debtMom, args.debtDad, args.salary, args.bonus))
你的函数 "example" 很好。问题是您正在尝试读取不存在的系统参数。尝试检查它们是否为空(在 else 子句中)。
虽然我赞同 argparse
方法,但这里有一个快速而肮脏的方法:
arg1, arg2, arg3 = [None, False, []]
if sys.argv[1:]: # test if there are atleast 1 argument (beyond [0])
arg1 = sys.argv[1]
if sys.argv[2:]:
arg2 = sys.argv[2] # careful 'True' is a string, not a boolean
arg3 = sys.argv[3:] # rest
大多数情况下,我在开始向脚本添加参数解析时使用它,而我对参数的选择还没有成熟。它比 'optionals' 更适合 'positionals'(使用 argparse 术语)。