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