Module and package

Module

A piece of script example.py

s = "Hello."
a = [100, 200, 300]

def foo(arg):
    print(f'arg = {arg}')

class Foo:
    pass

if __name__ == '__main__':
    print(s)
    print(a)
    foo('quux')
    x = Foo()
    print(x)

Execute example

import example
print(example.s)
print(example.a)

Hello.
[100, 200, 300]

import example as my_module
print(my_module.s)

Hello.

from example import s
print(s)

Hello.

from example import foo
foo('abc')

arg = abc

from example import Foo
x = Foo()
x

<example.Foo at 0x10ecace80>

Run as standalone script

Python example.py

Hello.
[100, 200, 300]
arg = quux
<__main__.Foo object at 0x10ed7ed30>

module search path

import sys
sys.path

[‘’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python36.zip’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python3.6’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python3.6/lib-dynload’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python3.6/site-packages’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python3.6/site-packages/aeosa’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python3.6/site-packages/IPython/extensions’, ‘/Users/qiuruihao/.ipython’]

sys.path.append(r'C:\Users\john')
sys.path

[‘’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python36.zip’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python3.6’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python3.6/lib-dynload’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python3.6/site-packages’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python3.6/site-packages/aeosa’, ‘/Users/qiuruihao/miniconda2/envs/py3/lib/python3.6/site-packages/IPython/extensions’, ‘/Users/qiuruihao/.ipython’, ‘/Users/john’]

import example
example.__file__

‘/Users/qiuruihao/Google Drive/Github/Python-notes/Notebooks/example.py’

Reload module

import example
import importlib
importlib.reload(example)

Package

The pkg folder contains two scripts - mod1.py and mod2.py

mod1.py

def foo():
    print('[mod1] foo()')

class Foo:
    pass

mod2.py

def bar():
    print('[mod2] bar()')

class Bar:
    pass

execute

import pkg.mod1, pkg.mod2
pkg.mod1.foo()

[mod1] foo()

x = pkg.mod2.Bar()
x

<pkg.mod2.Bar object at 0x033F7290>

from pkg.mod1 import foo
foo()

[mod1] foo()

from pkg.mod2 import Bar as Qux
x = Qux()
x

<pkg.mod2.Bar object at 0x036DFFD0>

Package initialization If a file named __init__.py is present in a package directory, it is invoked when the package or a module in the package is imported. This can be used for execution of package initialization code, such as initialization of package-level data.

__init__.py

print(f'Invoking __init__.py for {__name__}')
A = ['quux', 'corge', 'grault']
print(f'Invoking __init__.py for {__name__}')
import pkg.mod1, pkg.mod2
import pkg

Invoking __init__.py for pkg

pkg.A

[‘quux’, ‘corge’, ‘grault’]

pkg.mod1.foo()

[mod1] foo()

pkg.mod2.bar()

[mod2] bar()

If __init__.py contains:

__all__ = [
        'mod1',
        'mod2',
        'mod3',
        'mod4'
        ]
dir()

[‘__annotations__’, ‘__builtins__’, ‘__doc__’, ‘__loader__’, ‘__name__’, ‘__package__’, ‘__spec__’]

from pkg import *
dir()

[‘__annotations__’, ‘__builtins__’, ‘__doc__’, ‘__loader__’, ‘__name__’, ‘__package__’, ‘__spec__’, ‘mod1’, ‘mod2’, ‘mod3’, ‘mod4’]

mod2.bar()

[mod2] bar()

mod4.Qux

<class ‘pkg.mod4.Qux’>

References