how do I determine whether a python script is imported as module or run as script?

后端 未结 2 753
春和景丽
春和景丽 2020-12-15 16:25

The question is rather straightforward but not answered by searching. How do I determine in a python script whether this script is imported as a module or run as a script? I

相关标签:
2条回答
  • 2020-12-15 16:52

    As pointed out by @bobince:

    You will also be __main__ if you are a module invoked by python -m somemodule

    Let's suppose you have a Python file bar.py and an empty __init__.py, both inside a folder called foo:

    $ tree
    .
    └── foo
        ├── __init__.py
        └── bar.py
    
    $ cat foo/__init__.py
    

    The Python code blocks below are the content of foo/bar.py.

    Using __name__ (not working)

    print('Code executed as a %s' % 'script' if __name__ == '__main__' else 'module')
    

    This will produce:

    $ python foo/bar.py
    Code executed as a script
    
    $ python -m foo.bar
    Code executed as a script
    

    Solution 1: using vars() and sys.modules

    import sys
    mod_name = vars(sys.modules[__name__])['__package__']
    print('Code executed as a ' + ('module named %s' % mod_name if mod_name else 'script'))
    

    This will produce:

    $ python foo/bar.py
    Code executed as a module named foo
    
    $ python -m foo.bar
    Code executed as a script
    

    Solution 2: Using a try-except block on module import

    import sys
    try:
        import foo
        print('Code executed as a module')
    except ImportError:
        print('Code executed as a script')
        # Code will fail here, but you can still print a comprehensive error message before exiting:
        print('Usage: python -m foo.bar')
        sys.exit()
    

    This will produce:

    $ python foo/bar.py
    Code executed as a module
    
    $ python -m foo.bar
    Code executed as a script
    Usage: python -m foo.bar
    
    0 讨论(0)
  • 2020-12-15 17:04

    from python docs:

    When you run a Python module with

    python fibo.py

    the code in the module will be executed, just as if you imported it, but with the __name__ set to "__main__". That means that by adding this code at the end of your module:

    if __name__ == '__main__':
        # Running as a script
    

    you can make the file usable as a script as well as an importable module, because the code that parses the command line only runs if the module is executed as the “main” file

    0 讨论(0)
提交回复
热议问题