模块的搜索路径由五部分组成:
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返回一个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
https://zhuanlan.zhihu.com/p/64893308
https://www.cnblogs.com/f-ck-need-u/p/9961372.html