有没有更好的方法只在作为脚本运行时进行打印,而__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)
此方案具有最少的代码重复,每个脚本日志级别和项目范围的默认级别......这正是我想要的。
答案 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的建议去做。为了完整,我会离开我的。