2016-10-25 2 views
0

У меня есть сценарий python script_A и в его main он вызывает другую функцию python в другом файле.Лучший способ передать все аргументы скрипту python функции

script_A будет называться, как показано ниже:

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

Внутри script_A у меня есть:

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

Я хочу передать все аргументы, переданные script_A в func_B без фактического разбора аргументов.

i.e. Я хотел бы использовать argparse внутри func_B.

Каков наилучший способ для этого?

+0

'argparse' parses' sys.argv' по умолчанию. Это доступно из любого места в стеке вызовов. Просто 'import sys', чтобы проверить его напрямую. – hpaulj

ответ

1

Используйте встроенный модуль sys, чтобы получить список аргументов. Тогда делай то, что хочешь.

import sys 

print(sys.argv) 
0

Имейте в виду, что, как только ваш скрипт запускается, ты получишь свои аргументы в виде списка (sys.argv) разделить пробелами (где первый элемент является имя скрипта), так что вы» я не буду получать начальную строку «per se».

Имея это в виду, однако, вы могли бы сделать что-то вроде этого:

Иметь __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 
+0

Действительно ли sys.argv [1:] действителен? Возможно ли, что оно выдает исключение (если нет аргументов)? Я пробовал без аргументов, и все было хорошо, но хотелось убедиться. – sh0731

+0

Пока вы вызываете это из командной строки, да. Даже если вы не передадите какие-либо аргументы, всегда будет одно имя (сценарий). Вы можете попробовать: добавьте 'print sys.argv' в строке перед вызовом' foo (sys.argv [1:]) '(или сразу после' if __name__ == "__main __": ') и воспроизведите маленький **:-)** – BorrajaX

0

Просто используйте argparse в func_B именно так, как вы бы использовали его от script_A. Все будет хорошо. Аргументы командной строки и инструменты анализа аргументов командной строки, такие как argparse, не волнует, в каком файле вы находитесь.