4

我是 Python 新手(就像昨天一样),所以如果我还不知道“显而易见的”,请耐心等待。

有两种方法可以解决这个问题,任何一种都适合我,我不确定是否getoptoptparse包含我想要/需要的东西(来自我正在阅读的内容)?我想做类似于以下的事情:

python this.py --variable VariableName="Value" -v VariableName2="Value2"

或者

python this.py --VariableName "Value"

我面临的主要问题是,我可能需要有选择地传入任何变量,但不一定要以任何特定顺序传递所有变量(因此,sys.argv在我的情况下,原始变量不起作用)。对于其中一些变量,我可能会传递字符串、数字和/或数组。

在脚本中传递变量后,我需要以一种或另一种方式检查它们是否设置/不为空,并根据需要分配默认值。

谢谢!

4

3 回答 3

7

你肯定想要一个命令行参数解析器。Python 附带了一些。Python2.7argparse可以根据需要向后移植到早期版本,这是我推荐的。还有optparse。它不如 好argparse,但它仍然可以做得很好,并且可用于较旧的 python 版本以及较新的版本。

也有getopt,但与其他人相比,那一个几乎不值得一提。

于 2012-11-13T16:01:16.663 回答
1

我将首先回答我自己的问题。

尽管我很喜欢@mgilson 给出的答案,但我找到了一种“更简单”的方法。我对正则表达式非常熟悉,找出一个关联数组(即字典)并不太难。

import re

args = {}
args['pythonFile'] =  sys.argv[0]

for arg in sys.argv[1:]:
  variable = re.search('\-\-(.*)\=',arg)
  variable = variable.group(1)
  value = re.search('\=(.*)',arg)
  value = value.group(1)
  args[variable] = value

print args

这是证明:

$ /opt/python27/bin/python2.7 Test.py --var1=1 --var2="Testing This"
{'var1': '1', 'pythonFile': 'Test.py', 'var2': 'Testing This'}

哇!

于 2012-11-13T18:46:20.743 回答
1

我对上面的代码进行了一些重构,使其更加灵活和模块化(顺便说一句,这是一个很好的解决方案)。您现在可以添加类似的东西,--dev而不是--dev=true. 或者你可以两者都做。如果您不添加任何参数,它也不会使应用程序崩溃。

def get_cli_args():
    """
    Returns a dictionary of arguments passed to through the CLI.
    """

    import re
    import sys

    args = {}

    for arg in sys.argv[1:]:
        var = re.search('\-\-([A-Za-z]*)', arg) # optional value assignment
        var = var.group(1)
        value = re.search('\=(.*)', arg)
        value = value.group(1) if value else None
        args[var] = value

    return args
于 2018-09-07T03:57:26.790 回答