使用 argparse 将参数发送到 Python 脚本中的函数

Posted

技术标签:

【中文标题】使用 argparse 将参数发送到 Python 脚本中的函数【英文标题】:Use argparse to send arguments to function within Python script 【发布时间】:2019-07-09 18:29:14 【问题描述】:

我有点奇怪,我需要一个 Python 函数从脚本中运行,然后从我的主代码中调用该脚本。

我想使用subprocess 模块,并且知道如何使用它来将参数传递给纯脚本,但问题是,我需要将参数传递给其中的嵌套 Python 函数,其中大部分是可选的并具有默认值。

我认为arparse 会以某种方式帮助我做到这一点。

这是我正在尝试的示例:

## Some Argparse, which will hopefully help
import argparse

parser = argparse.ArgumentParser()

## All arguments, with only "follow" being required
parser.add_argument('file_name', help='Name of resulting csv file')
parser.add_argument('sub_name', help='Sub-name of resulting csv file')
parser.add_argument('follow', help='Account(s) to follow', required=True)
parser.add_argument('locations', help='Locations')
parser.add_argument('languages', help='Languages')
parser.add_argument('time_limit', help='How long to keep stream open')

args = parser.parse_args()


## Actual Function
def twitter_stream_listener(file_name=None,
                            sub_name='stream_',
                            auth = api.auth,
                            filter_track=None,
                            follow=None,
                            locations=None,
                            languages=None,
                            time_limit=20):
   ... function code ...
   ... more function code ...
   ...
   ...
   ## End of script

【问题讨论】:

argparse 只获取sys.argv 中的字符串(或您明确传递给parse_args 的其他列表)并为您提供对象args。您对args 的处理取决于您自己。您可以将其视为全局变量,或将其作为附加参数传递给 twitter_stream_listener,或者在需要时将单个属性作为参数传递。 您的代码看起来不错,您是否收到任何错误? 你确定要使用subprocess来启动程序A并在里面执行函数A.twitter_stream_listener()吗?一个更简单的方法是让您的代码import A 并直接调用A.twitter_stream_listener() aaaakshat,我没有收到任何错误,只是不确定如何构造我的代码以将我解析的参数发送到我的函数。 BoarGules,一开始我想这样做,但是我有问题的函数是由其他人编写的,我不知道如何重构它以允许我中途关闭所述函数(不影响内核其余部分中的任何其他进程),所以我试图给它自己的子进程,这似乎更容易即时关闭。 【参考方案1】:

如果您将参数传递给函数,您需要做的就是在执行它们时将它们输入函数:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-o", "--output_file_name", help="Name of resulting csv file")
parser.add_argument("-s", "--sub_name", default="stream_", help="Sub-name of resulting csv file")
parser.add_argument("-f", "--follow", help="Account(s) to follow", required=True)
parser.add_argument("-loc", "--locations", default=None, help="Locations")
parser.add_argument("-lan", "--languages", default=None, help="Languages")
parser.add_argument("-t", "--time_limit", default=20, help="How long to keep stream open")

options = parser.parse_args()

# then just pass in the arguments when you run the function
twitter_stream_listener(file_name=options.output_file_name,
                        sub_name=options.sub_name, 
                        auth=api.auth,
                        filter_track=None,
                        follow=options.follow,
                        locations=options.locations,
                        languages=options.languages,
                        time_limit=options.time_limit)


# or, pass the arguments into the functions when defining your function
def twitter_stream_listener_with_args(file_name=options.output_file_name,
                                      sub_name=options.sub_name, 
                                      auth=api.auth,
                                      filter_track=None,
                                      follow=options.follow,
                                      locations=options.locations,
                                      languages=options.languages,
                                      time_limit=options.time_limit):
    # does something
    pass

# then run with default parameters
twitter_stream_listener_with_args()

【讨论】:

【参考方案2】:

您可以在 argparse 部分中指定默认值(如果这是您想要实现的):

#!/usr/bin/python
import argparse
parser = argparse.ArgumentParser()

parser.add_argument('--argument', default = 'something', type = str, help = 'not helpful')
parser.add_argument('--arg2', default = None, type = str, help = 'not helpful')


args = parser.parse_args()

def foo(arg , arg2 ):
    print(arg)
    if not arg2 is  None:
        print(arg2)

foo(args.argument, args.arg2)


然后调用:

$ ./test.py
something

$ ./test.py --argument='somethingelse'
somethingelse

$ ./test.py --arg2=123
something
123

$ ./test.py --arg2='ipsum' --argument='lorem'
lorem
ipsum

这有用吗?

【讨论】:

【参考方案3】:

你可以这样做:

import argparse

## Actual Function
def twitter_stream_listener(file_name=None,
                            sub_name='stream_',
                            auth=api.auth,
                            filter_track=None,
                            follow=None,
                            locations=None,
                            languages=None,
                            time_limit=20):

    # Your content here


if __name__ == '__main__':
    parser = argparse.ArgumentParser()

    ## All arguments, with only "follow" being required
    parser.add_argument('follow', help='Account(s) to follow')
    parser.add_argument('--file_name', help='Name of resulting csv file')
    parser.add_argument('--sub_name', help='Sub-name of resulting csv file')
    parser.add_argument('--locations', help='Locations')
    parser.add_argument('--languages', help='Languages')
    parser.add_argument('--time_limit', help='How long to keep stream open')

    args = parser.parse_args()

    twitter_stream_listener(file_name=args.file_name, sub_name=args.sub_name, follow=args.follow,
                            locations=args.locations, languages=args.languages, time_limit=args.time_limit)

follow 将是唯一的必需参数,其余参数是可选的。可选的必须在开头提供--。如果需要,您可以通过 subprocess 轻松使用该模块。

使用命令行调用示例:

python -m your_module_name follow_val --file_name sth1 --locations sth2

【讨论】:

由于我还是个 Python 脚本新手,if __name__ == '__main__': 部分在这里实现了什么?没有那个我就不能用你的例子吗? 这个 *** 答案将比我在一条评论中所能做的更好地解释它:***.com/a/419185/3603682

以上是关于使用 argparse 将参数发送到 Python 脚本中的函数的主要内容,如果未能解决你的问题,请参考以下文章

将参数发送到引导模式窗口?

如何使用烧瓶将多个参数发送到路由?

使用ajax将参数发送到drupal视图

使用 argparse 将 Shell 参数传递给 Boto3 Python

如何将参数发送到 Azure Runbook api

如何将xml参数发送到WCF?