Sys
Sys en Python
Section titled “Sys en Python”¿Qué es sys?
Section titled “¿Qué es sys?”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 sysUso básico y más común
Section titled “Uso básico y más común”sys.argv
Section titled “sys.argv”Lista de argumentos pasados al script (el elemento 0 es el nombre del script).
print(sys.argv)# Ejecuta: python ejemplo.py a b -> ['ejemplo.py', 'a', 'b']sys.exit([code|message])
Section titled “sys.exit([code|message])”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")sys.path
Section titled “sys.path”Lista de rutas donde Python busca módulos. Puedes modificarla en tiempo de ejecución (útil para scripts).
import syssys.path.append("/mi/carpeta/lib")sys.modules
Section titled “sys.modules”Diccionario de módulos cargados en memoria (name -> module). Útil para inspección o recarga.
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.
sys.version y sys.version_info
Section titled “sys.version y sys.version_info”Información de la versión de Python.
print(sys.version) # string completaprint(sys.version_info) # tupla nombrada (major, minor, micro, ...)if sys.version_info < (3,10):print("actualiza python")sys.platform
Section titled “sys.platform”Cadena que indica la plataforma (e.g., ‘linux’, ‘darwin’, ‘win32’).
if sys.platform.startswith("win"):print("Windows")sys.maxsize
Section titled “sys.maxsize”Entero que normalmente indica el tamaño máximo práctico de estructuras (32/64-bit).
print(sys.maxsize)sys.getsizeof(obj[, default])
Section titled “sys.getsizeof(obj[, default])”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)sys.getrecursionlimit() / sys.setrecursionlimit(n)
Section titled “sys.getrecursionlimit() / sys.setrecursionlimit(n)”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.
sys.exc_info()
Section titled “sys.exc_info()”Información sobre la excepción actual: (exc_type, exc_value, traceback).
try:1/0except:print(sys.exc_info())sys.excepthook
Section titled “sys.excepthook”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_handlersys.getdefaultencoding() y sys.getfilesystemencoding()
Section titled “sys.getdefaultencoding() y sys.getfilesystemencoding()”Codificaciones por defecto (útil para I/O y compatibilidad entre plataformas).
print(sys.getdefaultencoding(), sys.getfilesystemencoding())sys.byteorder
Section titled “sys.byteorder”Orden de bytes de la máquina: ‘little’ o ‘big’.
print(sys.byteorder)sys.implementation
Section titled “sys.implementation”Información sobre la implementación de Python (CPython, PyPy, etc.)
print(sys.implementation)sys.flags
Section titled “sys.flags”Namespace con banderas con las que arrancó el intérprete (optimize, debug, interactive, etc.).
print(sys.flags)sys.getwindowsversion() (solo Windows)
Section titled “sys.getwindowsversion() (solo Windows)”Disponible solo en Windows; usar hasattr(sys, “getwindowsversion”) para comprobar.
sys.getswitchinterval() / sys.setswitchinterval()
Section titled “sys.getswitchinterval() / sys.setswitchinterval()”Controla la frecuencia de cambio de contexto entre threads (CPython).
Ejemplos prácticos
Section titled “Ejemplos prácticos”1) Script que procesa CLI simple
Section titled “1) Script que procesa CLI simple”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()2) Redirigir salida a un archivo
Section titled “2) Redirigir salida a un archivo”import syswith open("salida.log", "w", encoding="utf-8") as log:old_stdout = sys.stdoutsys.stdout = logprint("esto va al archivo")sys.stdout = old_stdout3) Manejo global de excepciones (logging)
Section titled “3) Manejo global de excepciones (logging)”import sys, traceback, logginglogging.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.log4) Comprobar versión de Python antes de correr
Section titled “4) Comprobar versión de Python antes de correr”import sysif sys.version_info < (3,8):sys.exit("Este script requiere Python 3.8+")Buenas prácticas y advertencias
Section titled “Buenas prácticas y advertencias”- No abuses de sys.path.append() en producción; usa paquetes instalables o PYTHONPATH/virtualenvs.
- sys.getsizeof() da tamaño superficial; para medir memoria profunda usa pympler o tracemalloc.
- Cambiar el límite de recursión con setrecursionlimit() solo sí entiendes el riesgo.
- sys.exit() en bibliotecas es mala idea: las bibliotecas deben lanzar excepciones, no terminar el proceso.
- Evita escribir directamente a sys.stdout sí usas frameworks que gestionan I/O (mejor usar logging).
Debugging y profiling
Section titled “Debugging y profiling”- sys.setrecursionlimit() para debugging de recursión (con cuidado).
- Para profiling de memoria/ejecución usa módulos especializados (tracemalloc, profile, cProfile), no sys directamente.
Mini-proyectos / ejercicios sugeridos
Section titled “Mini-proyectos / ejercicios sugeridos”- Script CLI con argparse que use sys.argv como fallback y registre errores en sys.stderr.
- Programa que redirija sys.stdout a un archivo y luego restaure la salida normal.
- Wrapper que compruebe sys.version_info y ejecute un comportamiento alterno para versiones antiguas.
- Logger global usando sys.excepthook para capturar excepciones no manejadas.
- Herramienta que inspeccione sys.modules para listar módulos cargados y su ruta (module.__file__).