【问题标题】:How to use `argparse` to pass arguments both from command line and from code?如何使用 `argparse` 从命令行和代码传递参数?
【发布时间】:2019-10-27 21:12:34
【问题描述】:

我有一个 python 程序,它接受许多参数并运行。使用argparse,我可以定义参数、它们的默认值、它们的解释,并且它可以用作一个方便的容器。所以从命令行传递参数一切都很好。

但是我也可以使用它来传递代码中的参数,以进行 API 调用吗?

【问题讨论】:

  • 查看args Namespaceparse_args() 创建的对象。您可以直接重新创建它,例如args = argparse.Namespace(foo='bar', arg1=12)

标签: python command-line arguments parameter-passing argparse


【解决方案1】:
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument("-f", "--file", dest="filename",
                help="write report to FILE", metavar="FILE")
parser.add_argument("-q", "--quiet",
                action="store_false", dest="verbose", default=True,
                help="don't print status messages to stdout")

args = parser.parse_args()

【讨论】:

  • 我想从 API 调用之类的代码中传递值,而不是从命令行传递值。
  • 如何在 python 中从命令行或 API 调用传入参数?
  • 好的,我会尽量给你答案。
  • 谢谢。实际上我意识到我只是缺乏咖啡并问了错误的问题。
【解决方案2】:

使用vars(),您可以像字典一样使用您的参数。

from argparse import ArgumentParser

parser = ArgumentParser()
parser.add_argument("-f", "--foo")
parser.add_argument("-b", "--bar")

args = vars(parser.parse_args())
print(f"args foo is {args['foo']}")
print(f"args bar is {args['bar']}")

执行和解析某些参数时的结果。

python3 test.py --foo cat --bar dog
args foo is cat
args bar is dog

【讨论】:

    【解决方案3】:

    从终端运行此文件时,您可以通过以下方式传递参数:

    python36 commandline_input.py 10

    python36 commandline_input.py 10 --foo 12

    第一个位置参数是强制性的,第二个是可选的,因此您需要一个标志 (--foo)。

    命令行输入.py:

    import argparse
    
    
    def main(mandatory_arg, optional_arg):
        # your program 
        pass
    
    
    if __name__ == '__main__':
        parser = argparse.ArgumentParser()
        # mandatory
        parser.add_argument('bar', help='Some Bar help')
        # optional
        parser.add_argument('-f', '--foo', default='default foo value',
                            help='Some foo help')
        
        args = parser.parse_args()
    
        # mandatory args
        print(args.bar, '(man)')
    
        # optional args
        if args.foo:
            print(args.foo, '(opt)')
        
        # your API call
        main(args.bar, [args.foo])
    

    【讨论】:

      【解决方案4】:

      是的,当然argparse 可用于从命令行和代码传递参数。

      例如:

      import argparse
      
      # Define default values
      parser = argparse.ArgumentParser()
      parser.add_argument('--foo', default=1, type=float, help='foo')
      
      # Get the args container with default values
      if __name__ == '__main__':
          args = parser.parse_args()  # get arguments from command line
      else:
          args = parser.parse_args('')  # get default arguments
      
      # Modify the container, add arguments, change values, etc.
      args.foo = 2
      args.bar = 3
      
      # Call the program with passed arguments
      program(args)
      

      【讨论】:

      • parse_args([]) 更好(相当于一个空的sys.argv[1:] 列表)。
      • 不敢相信我没有想到这个,谢谢!!
      猜你喜欢
      • 2018-11-29
      • 2019-06-01
      • 2021-10-10
      • 1970-01-01
      • 2016-03-25
      • 2020-11-29
      • 2012-03-12
      • 1970-01-01
      相关资源
      最近更新 更多