python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异

目录

代码目录结构

cwd:执行命令的目录、文件相对路径的起始点

测试1:在relative_path根目录执行命令

测试2:在test_12子目录执行命令

sys.path[0]:被执行文件的所在目录

测试3:在test_12子目录执行命令

实验一:还是在test_12子目录执行命令,但是修改import

实验2:还是在test_12子目录执行命令,也不修改import,但是修改sys.path

结论

实验3:在test_12 module中,导入test_0 module

再进一步的实验4

再进一步的实验5

再进一步的实验6:sys.path会积累的越来越多

总结


 

代码目录结构

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第1张图片

每一个py文件中都打印如下信息:

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第2张图片

 

cwd:执行命令的目录、文件相对路径的起始点

在哪个目录执行命令,cwd就是这个目录。和被执行的文件在哪个目录没关系。

测试1:在relative_path根目录执行命令

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第3张图片

可以看出:不管被执行的文件在哪个目录中,cwd都是relative_path根目录。因为python命令在这个目录下执行

测试2:在test_12子目录执行命令

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第4张图片

可见:在test_12子目录下无法直接找到test_0.py。

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第5张图片

可见:不管被执行文件在哪个目录中,只要在test_12子目录执行命令,cwd就是test_12子目录;

也可见得:sys.path[0]是被执行文件的所在目录,与在哪个目录执行文件没关系,只由被执行文件所在目录决定

sys.path[0]:被执行文件的所在目录

接下来,我们看看这两个路径中,哪个对import的相对路径有关。我们把每个py文件中加入import其他module的代码(以test_0.py为例)

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第6张图片

测试3:在test_12子目录执行命令

假设:如果module的相对路径也是由cwd决定,那么在test_12目录执行命令,应该可以直接import test_12,测试结果如下:

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第7张图片

Uh-oh,发现找不到test_12,这说明import module的相对路径不是由cwd决定

那相对路径的起点是由sys.path[0]决定吗?我们做几个实验

实验一:还是在test_12子目录执行命令,但是修改import

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第8张图片

实验结果OK

这个实验是认为sys.path中含有relative_path根目录,所以推断应该可以看见relative_path中的模块folder_1

实验2:还是在test_12子目录执行命令,也不修改import,但是修改sys.path

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第9张图片

实验结果也是OK的:

这个实验将待导入模块的目录加入sys.path中,使得test_12 module 可见

结论

以上两个实验,说明了import module时,相对路径的起点由sys.path决定,也就是被执行的文件所在目录决定。

如果待导入的module对于被执行文件所在目录不可见,则用sys.path.append添加路径

为了验证我们的结论是否可靠,我们做一个实验

实验3:在test_12 module中,导入test_0 module

原始代码test_12.py:

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第10张图片

推断:因为被执行文件在test_12目录中,test_0在根目录中,是不可见的,所以这样应该会报错。实验结果:

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第11张图片

所以,我们应该把根目录加入sys.path中:

而且修改后,运行OK。说明我们上面的结论有效!

 

再进一步的实验4

看网上有在import中直接带上..表示相对路径的,我也试试(只导入上一级的test_11):

import .. test_11

import . test_11

from .. import test_11

from . import test_11

这几种方法都不行,我是没搞定这种方法。

再进一步的实验5

另一种修改,在sys.path.append中新增的路径能不能不用绝对路径?也用相对路径?

我推断这里的相对路径是文件的相对路径,不是import的相对路径,所以,又和cwd相关了。所以在test_12目录下执行命令的话,应该修改为:

python3 用相对路径搜索文件,和用相对路径搜索module,搜索基准的差异_第12张图片

看下实验结果:

good,good,看来我的推断也是正确的

再进一步的实验6:sys.path会积累的越来越多

实验是这样的:test_12.py为了导入test_0.py,需要加入如下目录

如果被导入的test_0.py中也添加了路径:

此时打印出的路径中,是只能见到yy呢?还是两个新增的路径都能见到?实验结果

你看,是所有新增的搜索路径都可以见到。这会不会有隐患呢?

 

总结

用假设-实验的方法,证明了,python3中用相对路径执行、索引某个文件,起点由cwd决定,可由os.getcwd()获取;

用相对路径import module,相对路径的起点由sys.path决定。

你可能感兴趣的:(Python)