2010-11-18 14 views
12

Immaginate uno script viene eseguito in questi 2 set di "condizioni":Rilevare se script Python viene eseguito dalla console o da crontab

  1. azione dal vivo, istituito nel sudo crontab
  2. di debug, quando l'eseguo dalla console ./my-script.py

Quello che mi piacerebbe realizzare è un rilevamento automatico di "debug mode", senza di me specificare un argomento (ad esempio --debug) per lo script.

Esiste una convenzione su come eseguire questa operazione? C'è una variabile che può dirmi chi è il proprietario dello script? Se lo script ha una console su stdout? Esegui un ps | grep per determinarlo?

Grazie per il vostro tempo.

+0

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

risposta

29

Dal sys.stdin sarà un TTY in modalità debug, è possibile utilizzare la funzione os.isatty():

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

si potrebbe aggiungere una variabile di ambiente alla linea di crontab e verificare, all'interno della vostra applicazione python, se la variabile d'ambiente è impostato. file di configurazione

di crontab:

CRONTAB=true 

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

codice Python:

import os 

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

utilizzare un'opzione di riga di comando che solo cron userà.

Oppure un collegamento simbolico per assegnare allo script un nome diverso quando chiamato da cron. È quindi possibile utilizzare sys.argv[0] per distinguere tra i due modi di chiamare lo script.

+1

Anche se I pensa di usare 'os.isatty()' per rilevare se 'sysout' è un terminale è un hack. l'OP ha detto esplicitamente che non voleva farlo con un argomento della linea di comando. Inoltre, sembra che lo stesso Python potrebbe fare qualcosa di simile in certe situazioni - vedi le informazioni per l'opzione della linea di comando interprete ** - i ** in [1.1.3. Opzioni varie] (http://docs.python.org/using/cmdline.html?highlight=command%20line%20option#miscellaneous-options) nella sezione dei documenti online. – martineau

Problemi correlati