Только печатать при запуске как скрипт? - PullRequest
3 голосов
/ 14 декабря 2010

Есть ли лучший способ печати только при запуске в виде скрипта, когда __name__ == '__main__'?

У меня есть несколько сценариев, которые я также импортирую и использую части.

Нечто похожее на приведенное ниже будет работать, но уродливо, и его придется определять в каждом сценарии отдельно:

def printif(s):
    if globals()['__name__'] == '__main__':
        print (s)
    return

Я кратко рассмотрел некоторые из библиотек журналов python, но предпочел бы более легкое решение ...

редактирование:

Я закончил тем, что делал что-то вроде этого:

# mylog.py
import sys
import logging

log = logging.getLogger()

#default logging level
log.setLevel(logging.WARNING)

log.addHandler(logging.StreamHandler(sys.stdout))

А из сценария:

import log from mylog

...
log.info(...)
log.warning(...)
...

if __name__ == '__main__':
    #override when script is run..
    log.setLevel(logger.INFO)

Эта схема имеет минимальное дублирование кода для уровней журналов сценариев и уровень по умолчанию для всего проекта ... это именно то, что я хотел.

Ответы [ 3 ]

5 голосов
/ 14 декабря 2010
run_as_script = False  

def printif(s):  
    if run_as_script:  
        print (s)
    return

if __name__ == '__main__':  
    run_as_script = True
1 голос
/ 14 декабря 2010

В свете комментария пользователя 318904 к моему другому ответу я предоставлю альтернативу (хотя это может работать не во всех случаях, это может быть просто "достаточно хорошо").
Для отдельного модуля:

import sys

def printif(s):
    if sys.argv[0] != '':
        print (s)
0 голосов
/ 14 декабря 2010

Использование библиотеки журналов на самом деле не , что тяжеловес:

import logging

log = logging.getLogger('myscript')

def dostuff(...):
    ....
    log.info('message!')
    ...

if __name__ == '__main__':
    import sys
    log.setLevel(logging.INFO)
    log.addHandler(logging.StreamHandler(sys.stdout))
    ...

Одной бородавкой является сообщение «ПРЕДУПРЕЖДЕНИЕ: не найдены обработчики для myscript», которое регистрируется по умолчанию при импортеэтот модуль (а не запускать его как скрипт) и вызывать вашу функцию без настройки логирования. Он исчезнет в Python 3.2.Для Python 2.7 вы можете отключить его, добавив

log.addHandler(logging.NullHandler())

вверху, а для более старых версий вам придется определить класс NullHandler , например:

class NullHandler(logging.Handler):
    def emit(self, record):
        pass    

Оглядываясь назад на все это, я говорю: иди с предложением Геррата.Я оставлю свой здесь, для полноты.

...