仅作为脚本运行时打印?

时间:2010-12-14 00:47:39

标签: python scripting logging

有没有更好的方法只在作为脚本运行时进行打印,而__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 个答案:

答案 0 :(得分:5)

run_as_script = False  

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

if __name__ == '__main__':  
    run_as_script = True

答案 1 :(得分:1)

根据user318904对我的其他答案的评论,我会提供一个替代方案(虽然这可能不适用于所有情况,但它可能只是“足够好”)。
对于单独的模块:

import sys

def printif(s):
    if sys.argv[0] != '':
        print (s)

答案 2 :(得分:0)

使用日志库确实不是 重量级:

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中的It'll be gone。对于Python 2.7,您可以通过添加

来关闭它
log.addHandler(logging.NullHandler())

位于顶部,对于旧版本,您必须define a NullHandler class这样:

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

回顾这一切,我说:按照Gerrat的建议去做。为了完整,我会离开我的。