- Sys en Python
- Temario
- ¿Qué es sys?
- Uso básico y más común
- sys.argv
- sys.exit([code|message])
- sys.path
- sys.modules
- sys.stdout, sys.stderr, sys.stdin
- sys.version y sys.version_info
- sys.platform
- sys.maxsize
- sys.getsizeof(obj[, default])
- sys.getrecursionlimit() / sys.setrecursionlimit(n)
- sys.exc_info()
- sys.excepthook
- sys.getdefaultencoding() y sys.getfilesystemencoding()
- sys.byteorder
- sys.implementation
- sys.flags
- sys.getwindowsversion() (solo Windows)
- sys.getswitchinterval() / sys.setswitchinterval()
- Ejemplos prácticos
- Buenas prácticas y advertencias
- Debugging y profiling
- Mini-proyectos / ejercicios sugeridos
sys es un módulo integrado que ofrece interfaz con el intérprete de Python y el entorno donde corre (argumentos de línea de comandos, rutas, streams estándar, información de la plataforma, manejo de errores, configuración del intérprete, etc.).
Se importa con:
import sysLista de argumentos pasados al script (el elemento 0 es el nombre del script).
# ejemplo.py
import sys
print(sys.argv)
# Ejecuta: python ejemplo.py a b -> ['ejemplo.py', 'a', 'b']Termina el intérprete lanzando SystemExit. code=0 indica éxito; cualquier int distinto a 0 indica error. También puedes pasar un string (se imprime).
if len(sys.argv) < 2:
sys.exit("falta argumento")Lista de rutas donde Python busca módulos. Puedes modificarla en tiempo de ejecución (útil para scripts).
import sys
sys.path.append("/mi/carpeta/lib")Diccionario de módulos cargados en memoria (name -> module). Útil para inspección o recarga.
import importlib
import mi_modulo
importlib.reload(sys.modules['mi_modulo'])Streams estándar. Permiten redirigir o manipular entrada/salida.
sys.stdout.write("hola\n")
sys.stderr.write("error!\n")
data = sys.stdin.read()También puedes usar sys.stdout.buffer para I/O binaria.
Información de la versión de Python.
print(sys.version) # string completa
print(sys.version_info) # tupla nombrada (major, minor, micro, ...)
if sys.version_info < (3,10):
print("actualiza python")Cadena que indica la plataforma (e.g., 'linux', 'darwin', 'win32').
if sys.platform.startswith("win"):
print("Windows")Entero que normalmente indica el tamaño máximo práctico de estructuras (32/64-bit).
print(sys.maxsize)Devuelve el tamaño en bytes del objeto (solo tamaño del objeto, no profundidad).
x = [1,2,3]
print(sys.getsizeof(x)) # tamaño del objeto lista en memoria (superficial)Leer y ajustar el límite de recursión del intérprete.
print(sys.getrecursionlimit())
sys.setrecursionlimit(2000)Usar con cuidado: un límite demasiado alto puede provocar segfault.
Información sobre la excepción actual: (exc_type, exc_value, traceback).
try:
1/0
except:
print(sys.exc_info())Función que maneja excepciones no capturadas. Puedes reemplazarla para logging personalizado.
def mi_handler(exc_type, exc, tb):
print("Excepción no manejada:", exc_type, exc)
sys.excepthook = mi_handlerCodificaciones por defecto (útil para I/O y compatibilidad entre plataformas).
print(sys.getdefaultencoding(), sys.getfilesystemencoding())Orden de bytes de la máquina: 'little' o 'big'.
print(sys.byteorder)Información sobre la implementación de Python (CPython, PyPy, etc.)
print(sys.implementation)Namespace con banderas con las que arrancó el intérprete (optimize, debug, interactive, etc.).
print(sys.flags)Disponible solo en Windows; usar hasattr(sys, "getwindowsversion") para comprobar.
Controla la frecuencia de cambio de contexto entre threads (CPython).
# procesador.py
import sys
def main():
if len(sys.argv) < 2:
print("uso: python procesador.py archivo.txt")
sys.exit(1)
nombre = sys.argv[1]
with open(nombre, "r", encoding="utf-8") as f:
print(f.read())
if __name__ == "__main__":
main()import sys
with open("salida.log", "w", encoding="utf-8") as log:
old_stdout = sys.stdout
sys.stdout = log
print("esto va al archivo")
sys.stdout = old_stdoutimport sys, traceback, logging
logging.basicConfig(filename="errores.log", level=logging.ERROR)
def mi_excepthook(exc_type, exc_value, exc_tb):
logging.error("".join(traceback.format_exception(exc_type, exc_value, exc_tb)))
sys.excepthook = mi_excepthook
# cualquier excepción no capturada irá a errores.logimport sys
if sys.version_info < (3,8):
sys.exit("Este script requiere Python 3.8+")-
No abuses de
sys.path.append()en producción; usa paquetes instalables oPYTHONPATH/virtualenvs. -
sys.getsizeof()da tamaño superficial; para medir memoria profunda usapymplerotracemalloc. -
Cambiar el límite de recursión con
setrecursionlimit()solo si entiendes el riesgo. -
sys.exit()en bibliotecas es mala idea: las bibliotecas deben lanzar excepciones, no terminar el proceso. -
Evita escribir directamente a
sys.stdoutsi usas frameworks que gestionan I/O (mejor usar logging).
-
sys.setrecursionlimit()para debugging de recursión (con cuidado). -
Para profiling de memoria/ejecución usa módulos especializados (
tracemalloc,profile,cProfile), nosysdirectamente.
-
Script CLI con
argparseque usesys.argvcomo fallback y registre errores ensys.stderr. -
Programa que redirija
sys.stdouta un archivo y luego restaure la salida normal. -
Wrapper que compruebe
sys.version_infoy ejecute un comportamiento alterno para versiones antiguas. -
Logger global usando
sys.excepthookpara capturar excepciones no manejadas. -
Herramienta que inspeccione
sys.modulespara listar módulos cargados y su ruta (module.__file__).
Autor: Fravelz