Как я могу использовать argparse с существованием sys.args - PullRequest
0 голосов
/ 10 февраля 2019

Я хочу вызывать функции, используя аргументы, но я сбит с толку, потому что я использую два аргумента Sys.arg [1] и Sys.arg [2] для функций ввода-вывода файла.

Мой скрипт работает как $ python script.py inputfile.txt outputfile.txt

import argparse
import sys

input_file = sys.argv[1]
out_file = sys.argv[2]

def fuction1():
    #Stuff

def fucntion2():
    #Stuff

Я использую input_file и out_file в обеих этих функциях для разных задач!Теперь я хочу вызвать эти функции из аргумента командной строки, например $ python script.py runfuction1 inputfile.txt outputfile.txt $ python script.py runfuction2 inputfile.txt outputfile.txt

Я пробовал некоторые решения из других постов, например вопрос в номере поста: 27529610, но он не работает,Я запутался в использовании системных аргументов и argparse вместе.

Спасибо!

Ответы [ 2 ]

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

Вот версия, использующая argparse и 3 позиционных аргумента:

import argparse
import sys

def function1(input, output):
    print(f'1: {input} to {output}')

def function2(input, output):
    print(f'2: {input} to {output}')

adict = {'runfunction1': function1, 'runfunction2': function2}

parser = argparse.ArgumentParser()
parser.add_argument('cmd', choices=adict)
parser.add_argument('input')
parser.add_argument('output')

args = parser.parse_args()
print(sys.argv[1:])
print(args)
adict[args.cmd](args.input, args.output)

Некоторые примеры прогонов:

1445:~/mypy$ python3 stack54614049.py -h
usage: stack54614049.py [-h] {runfunction1,runfunction2} input output

positional arguments:
  {runfunction1,runfunction2}
  input
  output

optional arguments:
  -h, --help            show this help message and exit

1445:~/mypy$ python3 stack54614049.py 
usage: stack54614049.py [-h] {runfunction1,runfunction2} input output
stack54614049.py: error: the following arguments are required: cmd, input, output

1446:~/mypy$ python3 stack54614049.py foo
usage: stack54614049.py [-h] {runfunction1,runfunction2} input output
stack54614049.py: error: argument cmd: invalid choice: 'foo' (choose from 'runfunction1', 'runfunction2')

1446:~/mypy$ python3 stack54614049.py runfunction1 in out
['runfunction1', 'in', 'out']
Namespace(cmd='runfunction1', input='in', output='out')
1: in to out

1446:~/mypy$ python3 stack54614049.py runfunction2 in out
['runfunction2', 'in', 'out']
Namespace(cmd='runfunction2', input='in', output='out')
2: in to out

С 3 необходимыми позиционными аргументами, как этот argparse несделать намного более интересный разбор, чем смотреть

cmd, input, output = sys.argv[1:]

С choices он возражает, если строка cmd отсутствует в утвержденном списке.Это добавляет help дисплей.Делегирование строки cmd в функцию использует своего рода отображение.

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

Вам не нужно argparse для этого.Попробуйте:

import sys

to_run = int(sys.argv[1][-1])
input_file = sys.argv[2]
out_file = sys.argv[3]

def function1():
    # Stuff
    pass

def function2():
    # Stuff
    pass

(function1, function2)[to_run - 1]()

Более того, вы можете просто создать два отдельных скрипта!

Вы также можете использовать словарь, который немного более гибкий:

import sys

input_file = sys.argv[2]
out_file = sys.argv[3]

def function1():
    # Stuff
    pass

def function2():
    # Stuff
    pass

funcs = {'runfunction1': function1, 'runfunction2': function2}    
funcs[sys.argv[1]]()
...