Introdução
Esta seção introduz o conceito de um programa principal ou módulo principal (main module).
This tutorial is from open-source community. Access the source code
Esta seção introduz o conceito de um programa principal ou módulo principal (main module).
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.
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.
__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.
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 ...
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()
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.
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 (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
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.
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.
#!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.
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)
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
>>>
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
Parabéns! Você concluiu o laboratório do Módulo Principal. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.