3.8 KiB
python3小白课:导入模块详解
哪儿导入我们的模块?
[!question]
编写好模块之后,我们可以把模块放在哪里供我们的其他py程序导入和使用?
我们通常有两种方式:
- 使用环境变量
- 从默认模块加载路径导入
使用环境变量
这种方式我不太用,说的是可以在系统环境变量中,添加一个名为PYTHONPATH的环境变量,这个变量的值支持多个路径值,可以支持在多个路径寻找。比如我们可以设置d:\test进去试一试。如果加入用户变量则只对当前用于生效,如果加入系统变量则可以对所有用户生效。系统变量的查找优先顺序大于用户变量。
从默认模块加载路径导入
我们可以通过sys.path查看模块的默认导入路径有哪些。
# coding:utf-8
import sys, pprint
# pprint可以替代print函数,在需要输出的内容较多时,可以更友好的显示打印结果
pprint.pprint(sys.path)
Tip
可以看到,默认都会从我们的脚本所在的同一个目录导入,多数时候,我们放在同一个目录下是最方便的。
同时也会有些python的安装目录等。
在这里,我们需要注意到一个目录,今后我们安装一些三方库的时候,通常都是会安装到python安装目录下的lib\site-packages目录下的,因此如果你需要将自己写的模块放到一个python目录下,通常可以放到这个目录下。
你还可以临时性扩展这个列表:
# coding:utf-8
import sys, pprint
sys.path.append("d:\\test")
pprint.pprint(sys.path)
import mymodule
help(mymodule)
print("*" * 40)
print(mymodule.__doc__)
print(mymodule.add_1(1))
这里可以承接我们之前课时中讲过的已写好的模块来测试。
Tip
这样的添加是临时的,运行另外的python脚本程序这个路径就不会再找了,也不会影响系统环境变量等,也是一个比较推荐的编写方式。
模块的__all__变量
之前我们讲过,使用from 模块名 import *这样的语句会导入模块的所有成员。但有的时候我们不希望我们的每个成员都供外界使用,这时我们可以在模块中定义一个__all__变量,它是一个列表,我们想像外界暴露什么就写进去,没写的就不会暴露。
我们尝试定义一个mymodule.py文件如下:
# coding:utf-8
def add_1(num):
return num + 1
def add_2(num):
return num + 2
def add_3(num):
return num + 3
__all__ = ["add_1", "add_2"]
我们再在同一个目录下定义一个test.py文件用来测试:
# coding:utf-8
from mymodule import *
print(add_1(1))
print(add_2(1))
print(add_3(1))
此时运行它,就会发现报错,会发现add_3这个命令找不到。这个变量就实现了它的意义。
[!question]
如果定义了这个变量,还是需要使用没在列表里面的成员怎么办呢?
- 可以使用
import 模块名导入模块,这样是可以访问到的。 - 使用
from 模块名 import 成员名导入成员,这样也是可以导入的。
具体大家可以试一下哦~
参考例子:
# coding:utf-8
from mymodule import add_1, add_2, add_3
print(add_1(1))
print(add_2(1))
print(add_3(1))
单词释义
| 单词 | 释义 |
|---|---|
| PYTHONPATH | path,路径,pythonpath在这里是python脚本查找模块的路径 |
| path | 路径 |
| lib | 通常指程序的一些库文件 |
| site-packages | site网站,站点,packages,package包的复数形式,合起来理解为一些三方包吧 |