通过命令行传递Python变量?

时间:2012-11-13 15:59:27

标签: python command-line command-line-arguments

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

我可以通过两种方式解决这个问题,并且要么对我有用,要么我不确定getoptoptparse是否包含我想要/需要的东西(来自我的')阅读)?我想做类似以下的事情:

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

OR

python this.py --VariableName "Value"

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

一旦变量在脚本中传递,我将需要检查它们是否设置为非空,并根据需要分配默认值。

谢谢!

3 个答案:

答案 0 :(得分:7)

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

还有getopt,但与其他人相比,这一点几乎不值得一提。

答案 1 :(得分: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'}

活泉!

答案 2 :(得分:0)

我对上面的代码进行了一些重构,使其更加灵活和模块化(顺便说一下,这是一个很好的解决方案)。您现在可以添加类似--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