Import
下面是包的结构
package├── __init__.py├── subpackage1│ ├── __init__.py│ ├── moduleX.py│ └── moduleY.py├── subpackage2│ ├── __init__.py│ └── moduleZ.py└── moduleA.py
我们现在在moduleX.py中。
有绝对路径引入和相对路径引入两种方法。相对路径对于绝对路径来说优势为: 当调整模块和包的时候如果是绝对路径那么需要一个个挨着改。绝对路径对于相对路径来说优势为:相对路径取决于当前的包,所以在哪里执行就会有不一样的难以预料的后果(from . import module error: main is not a package。相对引用的' . '符号对应的就是__name__的值。如果在main函数中执行这个' . '就是__main__而不是上级包名。此时用from baoming import module就能解决)。 下面来导入一些包:[A]表示绝对路径 | [B]表示相对路径。
导入同一个子包下的 moduleY
[A] from package.subpackage1 import moduleY
[B] from . import moduleY
导入同一个子包下的 moduleY.py中的spam函数
[A] from package.subpackage1.moduleY import spam
[B] from .moduleY import spam
从兄弟子包下的moduleZ中导入func函数
[A] from package.subpackage2.moduleZ import func
[B] from ..moduleZ import func
导入父包下的moduleA
[A] from package import moduleA
[B] from .. import moduleA 或from ...package import moduleA
引用中有一个最常见的错误就是:循环引用
A.pyfrom .B import B_greet_backdef A_say_hello(): print('A says hello!') B_greet_back()def A_greet_back(): print('A says hello back!')if __name__ == '__main__': A_say_hello()B.pyfrom .A import A_greet_backdef B_say_hello(): print('B says hello!') A_greet_back()def B_greet_back(): print('B says hello back!')if __name__ == '__main__': B_say_hello()
此时会有引用错误:ImportError: cannot import name 'A_greet_back'
[解决办法]
1.可以引用整个包而不是指定引用包里的函数
更改 b.py from .A import A_greet_back 为 from . import A
2.延迟引用
B.pydef B_say_hello(): from .A import A_greet_back print('B says hello!') A_greet_back()def B_greet_back(): print('B says hello back!')if __name__ == '__main__': B_say_hello()