1. 什么是Python模块?
Python中,每一个 .py 文件都是一个模块。包含 .py 文件的目录叫做包。
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让我们能够有逻辑地组织我们的 Python 代码段。把相关的代码分配到一个模块里能让我们的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
参考文档:Python 模块
2. 搜索路径
当导入一个模块时,Python 解析器对模块位置的搜索顺序为:
1、当前目录。
2、shell 变量 PYTHONPATH 中的每个目录。
3、Python 安装路径。UNIX下,默认路径一般为/usr/local/lib/python/。
模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
关于模块路径的一些变量:
1 | python -c "import sys; print(sys.executable)" # 当前使用的python解释器路径 |
参考文档:我们的 Python 包都装到哪了?
3. pip安装模块到哪里?
pip 对应的python解释器,写在 pip 文件的 shebang 里的。
一般情况下,如果 pip 路径是 $path_prefix/bin/pip
,那么 Python 路径对应的就是 $path_prefix/bin/python
。
pip 安装包和模块,默认自动安装到 $path_prefix/lib/pythonX.Y/site-packages
pip 中更改安装位置的选项:
- –prefix PATH,替换
$path_prefix
为指定的值 - –root ROOT_PATH,在
$path_prefix
前面加上 ROOT_PATH - –target TARGET,直接指定安装位置到 TARGET
PS:Shebang(也被称为 Hashbang)是一个由井号和感叹号构成的字符序列(#!
),位于脚本文件的第一行的最前面。在Unix-like操作系统中,shebang可以用来指示操作系统使用哪个解释器来执行该脚本文件。对于pip文件,它的shebang通常是指向python解释器的路径。
关于pip的详细用法,参考文档:《Python包管理工具pip》
4. 导入模块
4.1. 导入模块语法
1 | import module_name_1 |
4.2. 相同父目录时导入模块
1、已知 name.py 内容为:
1 | name='voidking' |
2、相同目录下,进入python shell
1 | python |
3、导入模块
1 | import name |
或者(推荐):
1 | from . import name |
4.3. 不同目录时导入模块
模块 a 路径为:/path/to/x/a.py
模块 b 路径为:/path/to/y/b.py
模块a和模块b父目录不同,怎样让模块a被模块b导入?
方法一:PYTHONPATH变量中,添加模块a的父路径
1 | export PYTHONPATH=/path/to/x:$PYTHONPATH |
方法二:使用 sys.path.append 函数。
1 | sys.path.append('/path/to/x') |
PS:指定不搜索某个路径
1 | sys.path.remove('/path/to/x') |
4.4. 全局导入模块
模块 a 路径为:/path/to/x/a.py
怎样让模块a可以被全局导入?
方法一:PYTHONPATH变量中,添加模块a的父路径
1 | export PYTHONPATH=/path/to/x:$PYTHONPATH |
方法二:自定义模块的路径,写入到安装路径中的.pth
文件中。
具体操作方法:
1、进入 xxx/python3/lib/python3.6/site-packages 目录
2、新建 yyy.pth 文件,写入自定义模块的路径
1 | /path/to/x/ |
方法三:安装模块法
通过 setup.py 打包,并使用 pip install 进行安装。
5. 导入包
5.1. 导入包语法
1 | import package_name |
5.2. 相同父目录下导入包
如果我们有一个包结构如下:
1 | my_project/ |
在 main.py 中我们可以这样导入 my_package ,并使用其中的模块和函数。
1 | import my_package |
5.3. 不同父目录时导入包
如果我们的包不在我们的脚本所在的目录或子目录下,我们将无法直接导入。我们必须要让 Python 知道我们的包在哪。
比如我们有如下结构:
1 | / |
此时,我们需要把包的路径添加到 PYTHONPATH 或者 sys.path 才可以从 main.py 中导入 my_package:
1 | export PYTHONPATH=/another/path:$PYTHONPATH |
或者在 main.py 内:
1 | import sys |
5.4. 全局导入包
全局导入包的方法和全局导入模块的方法几乎完全相同,请参阅本文【全局导入模块】一节。