【问题标题】:Best way to propagate all arguments to python script to a function将所有参数传播到 python 脚本到函数的最佳方法
【发布时间】:2017-03-06 23:16:32
【问题描述】:

我有一个 python 脚本 script_A,在它的 main 中,它在不同的文件中调用另一个 python 函数。

script_A 将被调用如下:

script_A --option1 "foo" --option2 "hoo"

script_A里面我有:

if __name__ == "__main__":
   # call another function `func_B` defined in a different file

我想在func_B 中传递所有传递给script_A 的参数而不实际解析参数。

即我想在func_B 中使用argparse

最好的方法是什么?

【问题讨论】:

  • argparse 默认解析sys.argv。这可以从您的调用堆栈中的任何位置获得。只需import sys 直接检查即可。

标签: python arguments parameter-passing argparse


【解决方案1】:

使用内置模块sys 获取参数列表。然后做你想做的事。

import sys

print(sys.argv)

【讨论】:

    【解决方案2】:

    请记住,一旦您的脚本运行,您将在一个列表 (sys.argv) 中获取您的参数,该列表由空格分隔(其中第一项是脚本的名称),所以您不是将获得初始字符串“本身”。

    但是,考虑到这一点,您可以执行以下操作:

    在这样的文件中包含__main__

    mod1.py

    import sys
    from mod2 import foo
    
    
    if __name__ == "__main__":
        foo(sys.argv[1:]) # To remove the script's name, which is always the first argument
    

    然后在另一个模块中运行 argparser(在这个例子中我称之为mod2.py),如下所示:

    mod2.py

    import argparse
    
    
    def make_parser():
        parser = argparse.ArgumentParser(description='Process some foos.')
        parser.add_argument('--foo', type=str, nargs='+', help='a foo',)
        parser.add_argument('--baz', type=str, help='a baz')
        return parser
    
    
    def foo(args):
        parser = make_parser()
        parsed_args = parser.parse_args(args)
        print "Got me some foos: %s" % (parsed_args.foo)
        print "And a baz: %s" % (parsed_args.baz)
    

    运行 $ python ./mod1.py --foo bar1 bar2 --baz 1 会导致:

    $ python ./mod1.py --foo bar1 bar2 --baz 1
    Got me some foos: ['bar1', 'bar2']
    And a baz: 1
    

    【讨论】:

    • sys.argv[1:] 是否始终有效?是否有可能引发异常(如果没有参数)?我尝试了没有争论,这很好,但想确定一下。
    • 只要你从命令行调用它,是的。即使您不传递任何参数,也总会有一个(脚本的名称)。你可以自己试试:在调用foo(sys.argv[1:])之前的行中添加一个`print sys.argv`(或者在if __name__ == "__main__":之后)然后玩一点:-)
    【解决方案3】:

    只需在func_B 中使用argparse,就像在script_A 中使用它一样。它会正常工作的。像argparse 这样的命令行参数和命令行参数解析工具并不关心你在哪个文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多