Introdução ao Programa Principal

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Esta seção introduz o conceito de um programa principal ou módulo principal (main module).

Funções Principais

Em muitas linguagens de programação, existe o conceito de uma função main ou método.

// c / c++
int main(int argc, char *argv[]) {
    ...
}
// java
class myprog {
    public static void main(String args[]) {
        ...
    }
}

Esta é a primeira função que é executada quando uma aplicação é iniciada.

Módulo Principal em Python

Python não possui uma função ou método main. Em vez disso, existe um módulo principal (main module). O módulo principal é o arquivo fonte que é executado primeiro.

$ python3 prog.py
...

Qualquer arquivo que você fornecer ao interpretador na inicialização se torna main. O nome não importa.

Verificação __main__

É prática padrão para módulos que são executados como um script principal usar esta convenção:

## prog.py
...
if __name__ == '__main__':
    ## Running as the main program ...
    statements
    ...

As instruções contidas dentro da declaração if se tornam o programa main.

Programas Principais vs. Importações de Bibliotecas

Qualquer arquivo Python pode ser executado como principal ou como uma importação de biblioteca:

$ python3 prog.py ## Running as main
import prog   ## Running as library import

Em ambos os casos, __name__ é o nome do módulo. No entanto, ele só será definido como __main__ se estiver sendo executado como principal.

Normalmente, você não quer que as instruções que fazem parte do programa principal sejam executadas em uma importação de biblioteca. Portanto, é comum ter uma verificação if no código que pode ser usado de qualquer maneira.

if __name__ == '__main__':
    ## Does not execute if loaded with import ...

Modelo de Programa

Aqui está um modelo de programa comum para escrever um programa Python:

## prog.py
## Import statements (libraries)
import modules

## Functions
def spam():
    ...

def blah():
    ...

## Main function
def main():
    ...

if __name__ == '__main__':
    main()

Ferramentas de Linha de Comando

Python é frequentemente usado para ferramentas de linha de comando

$ python3 report.py portfolio.csv prices.csv

Isso significa que os scripts são executados a partir do shell / terminal. Casos de uso comuns são para automação, tarefas em segundo plano, etc.

Argumentos da Linha de Comando

A linha de comando é uma lista de strings de texto.

$ python3 report.py portfolio.csv prices.csv

Esta lista de strings de texto é encontrada em sys.argv.

## No comando bash anterior
sys.argv ## ['report.py, 'portfolio.csv', 'prices.csv']

Aqui está um exemplo simples de processamento dos argumentos:

import sys

if len(sys.argv) != 3:
    raise SystemExit(f'Usage: {sys.argv[0]} ' 'portfile pricefile')
portfile = sys.argv[1]
pricefile = sys.argv[2]
...

Entrada/Saída Padrão (Standard I/O)

Entrada/Saída Padrão (ou stdio) são arquivos que funcionam da mesma forma que arquivos normais.

sys.stdout
sys.stderr
sys.stdin

Por padrão, a função print é direcionada para sys.stdout. A entrada é lida de sys.stdin. Tracebacks e erros são direcionados para sys.stderr.

Esteja ciente de que stdio pode ser conectado a terminais, arquivos, pipes, etc.

$ python3 prog.py > results.txt
## or
$ cmd1 | python3 prog.py | cmd2

Variáveis de Ambiente (Environment Variables)

As variáveis de ambiente são definidas no shell.

$ export NAME dave
$ export RSH ssh
$ python3 prog.py

os.environ é um dicionário que contém esses valores.

import os

name = os.environ['NAME'] ## 'dave'

As alterações são refletidas em quaisquer subprocessos posteriormente lançados pelo programa.

Saída do Programa (Program Exit)

A saída do programa é tratada por meio de exceções.

raise SystemExit
raise SystemExit(exitcode)
raise SystemExit('Informative message')

Uma alternativa.

import sys
sys.exit(exitcode)

Um código de saída diferente de zero indica um erro.

A linha #!

No Unix, a linha #! pode iniciar um script como Python. Adicione o seguinte à primeira linha do seu arquivo de script.

#!/usr/bin/env python3
#./prog.py
...

Ela requer a permissão de executável.

$ chmod +x prog.py
## Então você pode executar
$ ./prog.py
... output ...

Nota: O Python Launcher no Windows também procura a linha #! para indicar a versão da linguagem.

Modelo de Script

Finalmente, aqui está um modelo de código comum para programas Python que são executados como scripts de linha de comando:

#!/usr/bin/env python3
#./prog.py

## Import statements (libraries)
import modules

## Functions
def spam():
    ...

def blah():
    ...

## Main function
def main(argv):
    ## Parse command line args, environment, etc.
    ...

if __name__ == '__main__':
    import sys
    main(sys.argv)

Exercício 3.15: Funções main()

No arquivo report.py, adicione uma função main() que aceite uma lista de opções de linha de comando e produza a mesma saída de antes. Você deve ser capaz de executá-la interativamente assim:

>>> import report
>>> report.main(['/home/labex/project/report.py', '/home/labex/project/portfolio.csv', '/home/labex/project/prices.csv'])
      Name     Shares      Price     Change
---------- ---------- ---------- ----------
        AA        100       9.22     -22.98
       IBM         50     106.28      15.18
       CAT        150      35.46     -47.98
      MSFT        200      20.89     -30.34
        GE         95      13.48     -26.89
      MSFT         50      20.89     -44.21
       IBM        100     106.28      35.84
>>>

Modifique o arquivo pcost.py para que ele tenha uma função main() semelhante:

>>> import pcost
>>> pcost.main(['/home/labex/project/pcost.py', '/home/labex/project/portfolio.csv'])
Total cost: 44671.15
>>>

Exercício 3.16: Criando Scripts

Modifique os programas report.py e pcost.py para que possam ser executados como um script na linha de comando:

$ ./report.py portfolio.csv prices.csv
Name Shares Price Change
---------- ---------- ---------- ----------
AA 100 9.22 -22.98
IBM 50 106.28 15.18
CAT 150 35.46 -47.98
MSFT 200 20.89 -30.34
GE 95 13.48 -26.89
MSFT 50 20.89 -44.21
IBM 100 106.28 35.84

$ ./pcost.py portfolio.csv
Total cost: 44671.15

Resumo

Parabéns! Você concluiu o laboratório do Módulo Principal. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.