2010-11-18 10 views
12

Imagine un script se está ejecutando en estos 2 juegos de "condiciones":detectar si script en Python se ejecuta desde la consola o mediante crontab

  1. acción en vivo, creado en sudo crontab
  2. de depuración, cuando lo ejecuto desde la consola ./my-script.py

lo que me gustaría lograr es una detección automática de "modo de depuración", sin mí especificando un argumento (por ejemplo --debug) para el guión.

¿Existe alguna convención sobre cómo hacer esto? ¿Hay alguna variable que pueda decirme quién es el propietario del script? Si el script tiene una consola al stdout? Ejecute un ps | grep para determinar eso?

Gracias por su tiempo.

+0

similar a [esta pregunta SO] (http://stackoverflow.com/questions/2086961/how-can-i-determine-if-a-python-script-is-executed-from-crontab) –

Respuesta

29

Desde sys.stdin habrá un TTY en modo de depuración, puede utilizar la función os.isatty():

import sys, os 
if os.isatty(sys.stdin.fileno()): 
    # Debug mode. 
    pass 
else: 
    # Cron mode. 
    pass 
4

Se podría añadir una variable de entorno a la línea de crontab y comprobar, dentro de su aplicación pitón, si la variable de entorno Está establecido. archivo de configuración

de crontab:

CRONTAB=true 

# run five minutes after midnight, every day 
5 0 * * *  /path/to/your/pythonscript 

código Python:

import os 

if os.getenv('CRONTAB') == 'true': 
    # do your crontab things 
else: 
    # do your debug things 
3

utilizar una opción de línea de comandos que sólo utilizará cron.

O un enlace simbólico para darle al script un nombre diferente cuando es llamado por cron. A continuación, puede usar sys.argv[0] para distinguir entre las dos formas de llamar al script.

+1

Aunque piense en usar 'os.isatty()' para detectar si 'sysout' es una terminal que es un hack. el OP dijo específicamente que no quería hacerlo con un argumento de línea de comando. Además, parece que Python podría estar haciendo algo como esto en ciertas situaciones: consulte la información para la opción de línea de comando del intérprete ** - i ** en [1.1.3. Opciones varias] (http://docs.python.org/using/cmdline.html?highlight=command%20line%20option#miscellaneous-options) sección de los documentos en línea. – martineau

Cuestiones relacionadas