How to use sys.Arg for data entry

Asked

Viewed 3,252 times

4

I have the function as follows:

def minha_funcao(x, y )

my code 
. 
.
.
end of my code

e a a entrada de dados eu utlizo da seginte maneira

print my_func([uma lista], [outra lista])

I’d like to use the sys.arg for the person to enter the data. And taking advantage, this is the best way to do this?

2 answers

7


It actually depends on what you want. If it’s the best way or you wouldn’t have to put more code. Imagine you run the code like this $ python tests.py arg1 arg2 To use argv can:

import sys

if len(sys.argv) <= 2: # aqui fazes a verificacao sobre quantos args queres receber, o nome do programa conta como 1
    print('argumentos insuficientes')
    sys.exit()

x = sys.argv[1] # arg1
y = sys.argv[2] # arg2

Note that the argv are interpreted as a string, to convert to a list you can: Suppose you execute the code like this: $ python3 tests.py 1,2,3 4,5,6. No spaces between the characters of each argument (1,2,3 and 4,5,6): do:

import sys

def my_func(x, y):
    print(x)
    print(y)

if len(sys.argv) <= 2: # aqui fazes a verificacao sobre quantos args queres receber, o nome do programa conta como 1
    print('argumentos insuficientes')
    sys.exit()

x = sys.argv[1].split(',')
y = sys.argv[2].split(',')

my_func(x,y)

Output:

['1', '2', '3'] ['4', '5', '6']

Where x is the first list and y will be the second

To be more noticeable you can send argvs even with the list format, I think that’s what you want:

$ python3 tests.py [1,2,3] [4,5,6] and you do:

import sys

def my_func(x, y):
    print(x)
    print(y)

if len(sys.argv) <= 2: # aqui fazes a verificacao sobre quantos args queres receber, o nome do programa conta como 1
    print('argumentos insuficientes')
    sys.exit()

x = [i.replace('[', '').replace(']', '') for i in sys.argv[1].split(',')]
y = [i.replace('[', '').replace(']', '') for i in sys.argv[2].split(',')]

my_func(x,y)

Output will be equal to the above example

4

Miguel’s answer already gives you the way and is the simplest, most direct and immediate solution (I even suggest the accepted answer). But remember that there is also the package argparse which is very good and allows you to build very professional solutions to handle the processing of the arguments received via command line.

An example of code that allows you to handle and receive two lists (just to illustrate, one of integer values and the other of real values) is this:

import sys
import argparse

# ---------------------------------------------
def main(args):
    """
    Função de entrada.

    Parâmetros
    ----------
    args: lista de str
        Argumentos recebidos da linha de comando.

    Retornos
    --------
    exitCode: int
        Código de erro/sucesso para indicação no término do programa.
    """

    # Processa a linha de comando
    args = parseCommandLine(args)

    # Usa a linha de comando! :)
    print('Valores de Uma Lista:')
    for v in args.umalista:
        print(v)

    print('\nValores de Outra Lista:')
    for v in args.outralista:
        print('{:.2f}'.format(v))

    return 0

# ---------------------------------------------    
def parseCommandLine(args):
    """
    Parseia os argumentos recebidos da linha de comando.

    Parâmetros
    ----------
    args: lista de str
        Argumentos recebidos da linha de comando.

    Retornos
    --------
    args: objeto
        Objeto com os argumentos devidamente processados acessíveis em 
        atributos. Para mais detalhes, vide a documentação do pacote argparse. 
    """

    desc = 'Programa de teste para o SOPT, que ilustra a utilização do pacote '\
           'argparse (para o processamento facilitado de argumentos da linha '\
           'de comando).'
    parser = argparse.ArgumentParser(description=desc)

    hlp = 'Uma lista de valores inteiros. Deve ter no mínimo dois valores.'
    parser.add_argument('-u', '--umalista', nargs='+', type=int, help=hlp)

    hlp = 'Uma lista de valores reais. Deve ter no mínimo um valor.'
    parser.add_argument('-o', '--outralista', nargs='+', type=float, help=hlp)

    args = parser.parse_args()

    if args.umalista is None or len(args.umalista) < 2:
        parser.error('A opção -u/--umalista requer no mínimo 2 valores.')

    if args.outralista is None or len(args.outralista) < 1:
        parser.error('A opção -o/--outralista requer no mínimo 1 valor.')

    return args

# ---------------------------------------------    
if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))

That way, when running the program with nothing, you have something like this:

C:\temp\SOPT>testeSOPT
usage: testeSOPT.py [-h] [-u UMALISTA [UMALISTA ...]]
                    [-o OUTRALISTA [OUTRALISTA ...]]
testeSOPT.py: error: A opção -u/--umalista requer no mínimo 2 valores.

The help (when executing with the -h parameter) is:

C:\temp\SOPT>testeSOPT -h
usage: testeSOPT.py [-h] [-u UMALISTA [UMALISTA ...]]
                    [-o OUTRALISTA [OUTRALISTA ...]]

Programa de teste para o SOPT, que ilustra a utilização do pacote argparse
(para o processamento facilitado de argumentos da linha de comando).

optional arguments:
  -h, --help            show this help message and exit
  -u UMALISTA [UMALISTA ...], --umalista UMALISTA [UMALISTA ...]
                        Uma lista de valores inteiros. Deve ter no mínimo dois
                        valores.
  -o OUTRALISTA [OUTRALISTA ...], --outralista OUTRALISTA [OUTRALISTA ...]
                        Uma lista de valores reais. Deve ter no mínimo um
                        valor.

If you don’t provide enough items for one of the lists, you have something like:

C:\temp\SOPT>testeSOPT -u 2 4
usage: testeSOPT.py [-h] [-u UMALISTA [UMALISTA ...]]
                    [-o OUTRALISTA [OUTRALISTA ...]]
testeSOPT.py: error: A opção -o/--outralista requer no mínimo 1 valor.

And by providing the expected amount of values, you have:

C:\temp\SOPT>testeSOPT -u 2 4 -o 1.45 1.77 2.74 7 23
Valores de Uma Lista:
2
4

Valores de Outra Lista:
1.45
1.77
2.74
7.00
23.00

P.S.: To prevent it from using UMALISTA as an example of data input into help, use attribute metavar:

. . .
hlp = 'Uma lista de valores inteiros. Deve ter no mínimo dois valores.'
parser.add_argument('-u', '--umalista', nargs='+', type=int, metavar='<número inteiro>', help=hlp)

hlp = 'Uma lista de valores reais. Deve ter no mínimo um valor.'
parser.add_argument('-o', '--outralista', nargs='+', metavar='<número real>', type=float, help=hlp)
. . .

Produces:

C:\temp\SOPT>testeSOPT -h
usage: testeSOPT.py [-h] [-u <número inteiro> [<número inteiro> ...]]
                    [-o <número real> [<número real> ...]]

Programa de teste para o SOPT, que ilustra a utilização do pacote argparse
(para o processamento facilitado de argumentos da linha de comando).

optional arguments:
  -h, --help            show this help message and exit
  -u <número inteiro> [<número inteiro> ...], --umalista <número inteiro> [<número inteiro> ...]
                        Uma lista de valores inteiros. Deve ter no mínimo dois
                        valores.
  -o <número real> [<número real> ...], --outralista <número real> [<número real> ...]
                        Uma lista de valores reais. Deve ter no mínimo um
                        valor.
  • 1

    It’s true Luiz this is also a good solution, for serious things would use it

  • Exactly, @Miguel. For quick and simple things, your solution is the best (and your answer should be accepted). :)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.