How to use sys.arg for data entry

3

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 would like to use sys.arg for the person to enter the data. And taking advantage, is this the best way to do this?

    
asked by anonymous 21.12.2016 / 17:18

2 answers

5

It really depends on what you want. If it is the best way or you would not have to put more code. imagine that you execute the code so $ python tests.py arg1 arg2 To use argv you 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 s interpreted as string, to convert to list you can: Suppose you want to code the code like this: $ python3 tests.py 1,2,3 4,5,6 . No spaces between the characters of each of the arguments (1,2,3 and 4,5,6): fazes:

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']

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

To make it more visible you can send argvs even with the format list, 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)

The output will be the same as the example above

    
21.12.2016 / 17:20
4

Mr Miguel's answer already gives you the path and is the simplest, direct and immediate solution (I even suggest that it is the accepted answer). But keep in mind that there is also the argparse package that is very good and allows you build very professional solutions to handle the processing of arguments received via the command line.

An example code that allows you to treat and receive two lists (just to illustrate one of integer values and one 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 executed 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 do not provide enough items for one of the lists, there is 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, 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
  

Q.: To prevent it from using UMALISTA plus as an example of data   to use the metavar attribute:

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

Produce:

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.
    
21.12.2016 / 17:44