开发者

Only print when run as script?

开发者 https://www.devze.com 2023-01-30 15:47 出处:网络
Is there a better way to only print when run as a script, when __name__ == \'__main__\' ? I have some scripts that I also import and use parts of.

Is there a better way to only print when run as a script, when __name__ == '__main__' ?

I have some scripts that I also import and use parts of.

Something like the below will work but is ugly, and would have to be defined in each script separately:

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

I looked briefly at some of python's logging libraries but would prefer a two lighter solution...

edit:

I ended up doing something like this:

# mylog.py
import sys
import logging

log = logging.getLogger()

#default logging level
log.setLevel(loggin开发者_StackOverflowg.WARNING)

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

And from the script:

import log from mylog

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

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

This scheme has minimal code duplication, per script log levels, and a project-wide default level...which is exactly what I wanted.


run_as_script = False  

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

if __name__ == '__main__':  
    run_as_script = True


In light of user318904's comment on my other answer, I'll provide an alternative (although this may not work in all cases, it might just be "good enough").
For a separate module:

import sys

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


Using a logging library is really not that heavyweight:

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))
    ...

One wart is the "WARNING: no handlers found for myscript" message that logging prints by default if you import this module (rather than run it as a script), and call your function without setting up logging. It'll be gone in Python 3.2. For Python 2.7, you can shut it off by adding

log.addHandler(logging.NullHandler())

at the top, and for older versions you'd have to define a NullHandler class like this:

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

Looking back at all this, I say: go with Gerrat's suggestion. I'll leave mine here, for completeness.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号