一个计算机技术爱好者与学习者

0%

好好学Python:Python模块和模块路径

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
2
3
python -c "import sys; print(sys.executable)" # 当前使用的python解释器路径
python -c "import sys; print(sys.path)" # 当前模块的搜索路径列表
python -c "import sys; print(sys.prefix)" # 当前使用的 $path_prefix

参考文档:我们的 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
2
import module_name_1
from package_name import module_name_2

4.2. 相同父目录时导入模块

1、已知 name.py 内容为:

1
name='voidking'

2、相同目录下,进入python shell

1
python

3、导入模块

1
2
>>> import name
>>> print(name.name)

或者(推荐):

1
2
>>> from . import name
>>> print(name.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
2
3
sys.path.append('/path/to/x')
# or
sys.path.insert(0, '/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/

详情参考python之使用.pth文件导入自定义模块

方法三:安装模块法
通过 setup.py 打包,并使用 pip install 进行安装。

5. 导入包

5.1. 导入包语法

1
import package_name

5.2. 相同父目录下导入包

如果我们有一个包结构如下:

1
2
3
4
5
6
my_project/

├── main.py
└── my_package/
├── __init__.py
└── module1.py

在 main.py 中我们可以这样导入 my_package ,并使用其中的模块和函数。

1
2
import my_package
my_package.module1.my_function()

5.3. 不同父目录时导入包

如果我们的包不在我们的脚本所在的目录或子目录下,我们将无法直接导入。我们必须要让 Python 知道我们的包在哪。

比如我们有如下结构:

1
2
3
4
5
6
7
8
9
10
/
├── path/
│ └── to/
│ └── my_project/
│ └── main.py
├── another/
└── path/
└── my_package/
├── __init__.py
└── module1.py

此时,我们需要把包的路径添加到 PYTHONPATH 或者 sys.path 才可以从 main.py 中导入 my_package:

1
export PYTHONPATH=/another/path:$PYTHONPATH

或者在 main.py 内:

1
2
3
import sys
sys.path.insert(0, "/another/path")
import my_package

5.4. 全局导入包

全局导入包的方法和全局导入模块的方法几乎完全相同,请参阅本文【全局导入模块】一节。

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-python-module/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~