2016-12-22 3 views
0

Я не могу достаточно положить все это вместе ... В начале моего скрипта У меня есть пользовательский ввод, чтобы получить основную информацию:пропустить ввод(), если аргументы передаются в сценарий

def get_provider(): 
    print("Operations are ... ", conversion_type) 
    conversion = input('Enter conversion ') 

Это (и несколько других разделов ввода пользователя) - вот что заставляет остальную часть скрипта.

Я хотел бы иметь возможность просто передать переменные и использовать argv для установки переменных, вместо того, чтобы использовать раздел ввода пользователя. Это больше для целей отладки. Однако я не хочу заниматься секцией ввода. Просто пропустите, если аргументы переданы.

Я думаю, что решение вращается вокруг argv parse и if __name__ == "__main__": ..., но, как я уже сказал, я не могу все это переложить.

Вот пример того, что я пытался, что не сделал достаточно работы:

def get_provider(): 
    print("Operations are ... ", conversion_types) 
    conversion_type = input('Enter conversion ') 
conversion_type = get_provider() 

def main(): 
    conversion_type = sys.argv[0] 

if __name__ == '__main__': 
    main() 

... the rest of the script... 
+1

вы должны смотреть на длину 'argv' для быстрого Hacky способом или наилучшим образом использовать' argparse' – martianwars

+2

вы не могли переписать 'get_provider' взять' conversion' в качестве аргумента, то получить его в качестве входных данных от пользователя в 'main'? –

ответ

0

Взгляните на модуль sys.

import sys 

if len(sys.argv) > 1: 
    # There are arguments to the script 
else: 
    # There aren't arguments to the script 
    # use input to take arguments 
+0

А, ок. Да. Я думаю, что я копаю это решение. Что-то не так с этим? Кажется, может быть, слишком просто? –

+0

Нет недостатков в использовании модуля 'sys' :) Это самый простой/приятный способ –

1

Быстрый Hacky способ сделать это (я пишу это, так как вы хотите иметь быструю отладку), чтобы проверить длину argv. Если длина больше 1, то у вас есть аргументы len(sys.argv) - 1, так как первым элементом является имя файла. Допустим, у вас есть один номер в качестве вашего ввода.

Это решение будет работать, если вы используетеpython script.pyдля запуска сценария. Остерегайтесь, если вы используете что-то более сложное.

def get_provider(): 
    print("Operations are ... ", conversion_types) 
    conversion_type = input('Enter conversion ') 

def main(): 
    if len(sys.argv) == 1: 
     # only your file name 
     conversion_type = get_provider() 
    else: 
     conversion_type = sys.argv[1] 

if __name__ == '__main__': 
    main() 

... the rest of the script... 

Для более устойчивого решения, пожалуйста, используйте библиотеку argparse. Этот answer может вас заинтересовать.

+0

Это также хорошее решение. Но у меня есть вопрос ... В этом случае, используя 'if __name__ == '__main__': main()' будет ли это работать, если я импортирую этот скрипт и отправлю ему переменные, которые в противном случае приходили бы через cli args ? Если это так, мне нужно отступывать все ниже 'if __name__ == '__main__': main()' или он будет просто просто взять сценарий оттуда ... –

+0

Это почти то же самое, что и принятый вами ответ, кроме для дополнительной детализации. – martianwars

1

Ниже приведен пример необязательного позиционного аргумента с использованием argparse.

В этом примере будет использоваться аргумент командной строки, если он задан. В противном случае пользователь будет запрашивать ввод. В любом случае, conversion_type заселяется.

#!/usr/bin/env python3 

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('conversion_type', nargs='?') 
args = parser.parse_args() 

if args.conversion_type: 
    conversion_type = args.conversion_type 
else: 
    conversion_type = input('conversion_type: ') 
print(conversion_type) 
Смежные вопросы