Introducción al Programa Principal

PythonPythonBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta sección introduce el concepto de un programa principal o módulo principal.

Funciones principales

En muchos lenguajes de programación, existe el concepto de una función o método main.

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

Esta es la primera función que se ejecuta cuando se lanza una aplicación.

Módulo principal de Python

Python no tiene una función o método main. En cambio, existe un módulo principal. El módulo principal es el archivo fuente que se ejecuta primero.

$ python3 prog.py
...

Cualquier archivo que le des al intérprete al inicio se convierte en main. No importa el nombre.

Verificación de __main__

Es una práctica estándar para los módulos que se ejecutan como un script principal utilizar esta convención:

## prog.py
...
if __name__ == '__main__':
    ## Ejecutándose como el programa principal...
    declaraciones
  ...

Las declaraciones incluidas dentro de la instrucción if se convierten en el programa principal.

Programas principales vs. importaciones de bibliotecas

Cualquier archivo de Python puede ejecutarse como principal o como una importación de biblioteca:

$ python3 prog.py ## Ejecutándose como principal
import prog   ## Ejecutándose como importación de biblioteca

En ambos casos, __name__ es el nombre del módulo. Sin embargo, solo se establecerá en __main__ si se ejecuta como principal.

Por lo general, no se desea que las declaraciones que forman parte del programa principal se ejecuten durante una importación de biblioteca. Por lo tanto, es común tener una comprobación if en el código que puede usarse de cualquiera de las dos maneras.

if __name__ == '__main__':
    ## No se ejecuta si se carga con import...

Plantilla de programa

A continuación se presenta una plantilla de programa común para escribir un programa de Python:

## prog.py
## Declaraciones de importación (bibliotecas)
import módulos

## Funciones
def spam():
 ...

def blah():
 ...

## Función principal
def main():
 ...

if __name__ == '__main__':
    main()

Herramientas de línea de comandos

Python se utiliza a menudo para herramientas de línea de comandos

$ python3 report.py portfolio.csv prices.csv

Esto significa que los scripts se ejecutan desde la shell / terminal. Los casos de uso comunes son para automatización, tareas en segundo plano, etc.

Argumentos de línea de comandos

La línea de comandos es una lista de cadenas de texto.

$ python3 report.py portfolio.csv prices.csv

Esta lista de cadenas de texto se encuentra en sys.argv.

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

A continuación se presenta un ejemplo simple de procesamiento de los 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]
...

E/S estándar

La Entrada/Salida estándar (o stdio) son archivos que funcionan de la misma manera que los archivos normales.

sys.stdout
sys.stderr
sys.stdin

Por defecto, la función print se dirige a sys.stdout. La entrada se lee de sys.stdin. Las trazas de pila y los errores se dirigen a sys.stderr.

Tenga en cuenta que el stdio puede estar conectado a terminales, archivos, tuberías, etc.

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

Variables de entorno

Las variables de entorno se establecen en la shell.

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

os.environ es un diccionario que contiene estos valores.

import os

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

Los cambios se reflejan en cualquier subproceso lanzado posteriormente por el programa.

Salida del programa

La salida del programa se maneja a través de excepciones.

raise SystemExit
raise SystemExit(exitcode)
raise SystemExit('Mensaje informativo')

Una alternativa.

import sys
sys.exit(exitcode)

Un código de salida no nulo indica un error.

La línea #!

En Unix, la línea #! puede ejecutar un script como Python. Agregue lo siguiente a la primera línea de su archivo de script.

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

Requiere permiso de ejecución.

$ chmod +x prog.py
## Luego puede ejecutar
$./prog.py
... salida...

Nota: El lanzador de Python en Windows también busca la línea #! para indicar la versión del lenguaje.

Plantilla de script

Finalmente, aquí está una plantilla de código común para los programas de Python que se ejecutan como scripts de línea de comandos:

#!/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)

Ejercicio 3.15: Funciones main()

En el archivo report.py agregue una función main() que acepte una lista de opciones de línea de comandos y produzca la misma salida que antes. Debería poder ejecutarlo de manera interactiva como esto:

>>> 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 el archivo pcost.py de modo que tenga una función main() similar:

>>> import pcost
>>> pcost.main(['/home/labex/project/pcost.py', '/home/labex/project/portfolio.csv'])
Total cost: 44671.15
>>>
✨ Revisar Solución y Practicar

Ejercicio 3.16: Creando scripts

Modifique los programas report.py y pcost.py de modo que puedan ejecutarse como un script en la línea de comandos:

$./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
✨ Revisar Solución y Practicar

Resumen

¡Felicitaciones! Has completado el laboratorio del Módulo Principal. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.