【问题标题】:Passing Python variables via command line?通过命令行传递 Python 变量?
【发布时间】:2012-11-02 01:56:55
【问题描述】:

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

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

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

或

python this.py --VariableName "Value"

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

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

谢谢!

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      我会先回答我自己的问题。

      尽管我很喜欢@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'}
      

      哇!

      【讨论】:

      • 虽然这听起来很聪明(确实),但从我所看到的情况来看,这可能不是实现您真正想要的最“pythonic”的方式。不过不用担心,你很快就会吸收python的特性,越用越自然。
      • 哈,谢谢,当我写这篇文章时,我很确定情况就是这样。最终,随着我了解的更多,我会有所改进,但现在对于我这个级别的任何初学者来说,都可能会从中受益。
      • 先学习然后做或立即做任何事情之间的正确平衡取决于解决问题的需要与学习工具的需要之间的平衡。但我想这适用于每个问题工具关系......(深度优先搜索可能会瘫痪......)
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-28
        • 1970-01-01
        • 2013-05-01
        • 2021-06-15
        • 2016-09-15
        • 1970-01-01
        相关资源
        最近更新 更多