Python Package, Module and Import
Table of Contents
1. Python Package Module and Import
1.1. package and module
~/download/test_pkg@sunway-t14> tree . . ├── __init__.py ├── main.py ├── module1 │ ├── foo.py │ ├── bar.py │ ├── __init__.py ├── module2.py
在上面的例子中:
- test_pkg 是一个 package
- module1 是一个 module, 对应 module1 这个目录
- module1.foo 是一个 module, 对应 module1/foo.py
- module2 是一个 module, 对应 module2.py
- module1.foo.foo 和 module2.foo 是两个 module 中定义的函数, 它们不是 module
1.2. import
1.2.1. import 两种写法:
- import <module>
- from <module> import <module|symbol>
import 和 from 后必须跟 module, 所以:
- import module2.foo 会失败, 因为 module2.foo 不是 module
- from module2 import foo 可以成功
1.2.2. as
import 会绑定名称以便使用, 例如:
import module1.foo 之后可以用 module1.foo 引用 module1.foo 这个 module, 通过 as, 可以绑定到一个自定义的名字:
- import module1.foo as foo1
- from module1 import foo as foo1
不过有一个问题: as 绑定的名字无法做为 module 的别名…. 例如 import module1 as m1; import m1.foo 会失败, 提示 m1 不是一个 module name
1.2.3. from
相对于普通的 import <module>, from <module> import xxx 更灵活一些:
- 它可以 import 除 module 外的其它符号, 比如 class, function, variable 等
- 它可以支持 relative import
1.2.4. relative import
在同一个 pacakge 下的不同的 module 引用其它 module, 有两种方法:
absolution import
module1.foo 引用 module1.bar: import module1.bar module1.foo 引用 module2: import module2
直接用 import bar 会失败, 必须是完整的名称
relative import
module1.foo 引用其它 module:
from . import bar from .. import module2 from .bar import *
通过 relative import, 一个 submodule 可以容易的复制到其它 package 中, 或者做为整体更改它在 package 中的层次