Python: используйте argparse для отправки аргументов в функцию в скрипте - PullRequest
0 голосов
/ 15 февраля 2019

Привет всем.Итак, я нахожусь в некоторой странной ситуации, когда мне нужна функция 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

Буду признателен за любые советы по этому вопросу.

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Вы можете сделать это так:

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
0 голосов
/ 15 февраля 2019

Если вы передаете аргументы в функции, все, что вам нужно сделать - это передать их в функцию при их выполнении:

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()

0 голосов
/ 15 февраля 2019

Вы можете указать значения по умолчанию в разделе 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

Это полезно?

...