python配置模块的搜索路径和包的导入

python配置模块的搜索路径和包的导入

模块的搜索路径

一、模块搜索路径的组成

模块的搜索路径由五部分组成:

  • 程序的主目录
  • PYTHONPATH目录
  • 标准库目录
  • 任何.pth文件中的内容
  • 第三方拓展应用的site-packages主目录

1、程序的主目录(自动的)

主目录的含义与你如何运行代码相关,当你运行一个程序的时候,主目录就是包含程序的顶层脚本文件的目录。当在交互式命令行工作下时,主目录就是你当前的工作目录。
程序的主目录总是优先被搜索的,如果一个程序完全位于单独的一个目录下,那么所有导入都会自动工作而无需进行搜索路径配置。

2、PYTHONPATH目录(可配置的)

在搜索完程序的主目录后,Python会从左至右地搜索PYTHONPATH环境变量(前提是需要导入的包已经被你手动设置到PYTHONPATH中了)设置中罗列出的所有变量。
简单地说,PYTHONPATH是设置包含Python程序文件的目录列表,这些目录可以是用户定义的或者特定平台的目录名。我们可以把我们想要被搜索的特定python文件都添加到PYTHONPATH中,以便实现路径配置,方便搜索。

3、标准库目录(自动的)

在搜索玩PYTHONPATH之后,Python会接着搜索安装在机器上的标准库模块目录,因为i标准库目录是一定会被搜索的,所以通常是不需要添加到PYTHONPATH之中或者包含到路径文件夹中的。

4、.pth文件目录(可配置的)
Python允许用户将需要添加的目录添加到模块的搜索路径中,也就是在.pth文本文件中一行一行地列出目录,需要将.pth文件放置在适当的目录中,一个.pth文件可以放置在Python安装的顶层目录,可以放在Python安装目录中的标准模块的安装sitepackages路径下。

5、第三方扩展应用的Lib\site-packages目录(自动的)

最后,Python会自动将标准库的site-packages子目录添加到模块搜索路径中。按照惯例,这里是大多数第三方扩展安装的地方,自动被在distutils工具管理。

二、配置模块搜索路径的方法

在上说的文件路径搜素中,能够配置的选项只有PYTHONPATH环境变量和路径文件。例如,在Windows平台上,创建PYTHONPATH环境变量,设置变量的值,两个目录使用分号隔开。

C:\pycode\utilities;D:\pycode\package1

创建一个.pth文件,内容如下

C:\pycode\utilities
D:\pycode\package1

三、sys.path

我们可以使用sys.path来查看当前机器上的实际模块搜索路径配置。sys.path返回一个list

import sys
sys.path

在这里插入图片描述

我们还可以临时配置PYTHONPATH,使用sys.path.append或者sys.path.insert

sys.path.append('something')
sys.path

在这里插入图片描述

sys.path.insert(-1, 'anything')
sys.path

在这里插入图片描述

包导入的例子

一、简介

python的关键字import可以导入各种模块,包括自定义的模块
import的用法通常有两种:
1、不指定别名直接导入

import modulename

2、指定别名导入

import modulename as customname

3、使用from进行导入模块中的部分属性

from modeulename import func1, func2

现在我们考虑以下问题,假如我们的文件目录如下

--dir0
  | file1.py
  | file2.py
  | --dir1
      | file3.py
      | file4.py
  | --dir2
      | file5.py

二、导入同级模块

--dir0
  | file1.py
  | file2.py
  | --dir1
      | file3.py
      | file4.py
  | --dir2
      | file5.py

如果我们希望在file2.py文件中导入file1.py文件,那么直接使用import在同级中进行导入就可以了。
在file2.py文件中

import file1

同样的道理,如果我们希望在file3.py文件中导入file4.py文件,那么也是可以直接进行导入的。
在file3.py文件中

import file4

三、导入下级模块

--dir0
  | file1.py
  | file2.py
  | --dir1
      | file3.py
      | file4.py
  | --dir2
      | file5.py

如果我们希望在file1.py文件中导入,子目录dir1中的file3.py文件,那么需要在下级文件中创建一个空白的__init__.py文件,这个文件的作用是将该目录初始化为一个包,以便进行导入。

--dir0
  | file1.py
  | file2.py
  | --dir1
      | __init__.py
      | file3.py
      | file4.py
  | --dir2
      | file5.py

然后我们可以在file1.py中这样进行导入

import dir1.file3

或者

from dir1 import file3

四、导入上级模块

--dir0
  | file1.py
  | file2.py
  | --dir1
      | __init__.py
      | file3.py
      | file4.py
  | --dir2
      | file5.py

如果我们希望在file3.py文件中导入上级目录dir0中的file1.py文件,我们需要使用到sys库

import sys
sys.path.append('..')

'..'的含义是搜索路径返回上一层级,那么其实对于在dir1中的文件来说,默认的搜索路径是在dir1文件夹内,那么使用了这一语句之后,搜索路径是从dir0开始,那么我们直接再进行导入就可以了。

在file3.py文件中

import sys
sys.path.append('..')
import file1

五、导入其他任意位置模块

--dir0
  | file1.py
  | file2.py
  | --dir1
      | __init__.py
      | file3.py
      | file4.py
  | --dir2
      | file5.py

如果我们希望在file5.py文件中导入file3.py文件,这算是同级导入,那么我们其实可以采用上一个方法。

在file5.py文件中

import sys
sys.path.append('..')
import dir1.file3

或者

import sys
sys.path.append('..')
from dir1 import file3

其实这样我们可以导入任意位置的模块,关键的一点是要把该模块的位置加入python的搜索路径sys.path,我们可以使用绝对路径来做到这一点。

比如dir0在内存中的存放位置为C:\buffer\study_data\dir0
在file5.py文件中

import sys
sys.path.append('C:\buffer\study_data\dir0')
from dir1 import file3

六、Reference

https://zhuanlan.zhihu.com/p/64893308
https://www.cnblogs.com/f-ck-need-u/p/9961372.html

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值