目录
简介
从物理表现上来说:
包:文件夹
模块:文件
一个文件夹下包含__init__.py文件,则成为一个package 。
__init__.py本身是一个模块,这个模块的名字就是它的包名。
导入模块
- import 模块名
- from 模块名 import 具体(变量/函数/类名...)
- from 模块名 import *
- from 包名 import 模块
示例
目录结构
- 在c8.py中导入t文件夹中的c4.py中的变量a,三种方法。
注意第二种,如果直接使用“import t.c4”,在使用变量a的时候需用t.c4.a。
#方法一
from t import c4
print(c4.a)
#方法二
import t.c4
print(t.c4.a)
import t.c4 as m
print(m.a)
#方法三
from t.c4 import a
print(a)
from t import c4
print(c4.a)
from t.c4 import *
print(a)
tips:
在c4.py文件中加入内置变量__all__ = ['a','c'],可以指定当使用'import *'时可以导入的元素(这里只能导入变量a和c)。
# c4.py
__all__ = ['a','c']
a = 2
b = 3
c = 4
#c8.py
from t.c4 import *
print(a)
print(c)
print(b)
#执行结果:
> python c8.py
2
4
Traceback (most recent call last):
File "E:\word\Python\code\abc\c8.py", line 8, in <module>
print(b)
NameError: name 'b' is not defined
导入时换行
#方法一
from t.c4 import a, b, \
c
#方法二
from t.c4 import (a, b,
c)
.pyc文件
python解释器所编译的字节码文件,可以提升python程序的运行效率。
__init__.py
当一个包被导入时,__init__.py文件将首先被自动执行。
在__init__.py文件里,可以通过变量 "__all__ = ['c4']" 指定当使用 * 时,可以导出的模块名(即使用import *时,能导入的模块名)。
示例
目录结构:
#__init_.py文件
__all__=['c4']
#c8.py文件
from t import *
print(c4.a)
print(c5.e)
#执行结果:
> python c8.py
2
Traceback (most recent call last):
File "E:\word\Python\code\abc\c8.py", line 8, in <module>
print(c5.e)
NameError: name 'c5' is not defined
批量导入
当需要多次导入同一个模块时,可以在__init__文件中导入。
Tips
- 包和模块不会被重复导入(性能问题)。
- 避免循环导入。
循环导入示例
目录结构:
情况1:直接的循环导入
#p1.py
from p2 import p2
p1=2
print(p2)
#p2.py
from p1 import p1
p2=2
执行p1.py文件会报错:
原因是执行p1.py文件时,“from py2”会让python执行p2.py文件,而p2.py中又导入了p1模块,这样就构成了循环导入。
> python p\p1.py
Traceback (most recent call last):
File "E:\word\Python\code\abc\p\p1.py", line 1, in <module>
from p2 import p2
File "E:\word\Python\code\abc\p\p2.py", line 1, in <module>
from p1 import p1
File "E:\word\Python\code\abc\p\p1.py", line 1, in <module>
from p2 import p2
ImportError: cannot import name 'p2' from partially initialized module 'p2' (most likely due to a circular import) (E:\word\Python\code\abc\p\p2.py)
情况2:间距循环导入
#p1.py
from p2 import p2
p1=2
print(p2)
#p2.py
from p3 import p3
p2=2
#p3.py
from p1 import p1
p3=2
执行p1.py文件报错:
> python p\p1.py
Traceback (most recent call last):
File "E:\word\Python\code\abc\p\p1.py", line 1, in <module>
from p2 import p2
File "E:\word\Python\code\abc\p\p2.py", line 1, in <module>
from p3 import p3
File "E:\word\Python\code\abc\p\p3.py", line 1, in <module>
from p1 import p1
File "E:\word\Python\code\abc\p\p1.py", line 1, in <module>
from p2 import p2
ImportError: cannot import name 'p2' from partially initialized module 'p2' (most likely due to a circular import) (E:\word\Python\code\abc\p\p2.py)