119 lines
3.8 KiB
Markdown
119 lines
3.8 KiB
Markdown
# 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包的复数形式,合起来理解为一些三方包吧 | |