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会积累的越来越多

总结


 

代码目录结构

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

实验结果OK

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

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

实验结果也是OK的:

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

结论

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

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

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

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

原始代码test_12.py:

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

所以,我们应该把根目录加入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目录下执行命令的话,应该修改为:

看下实验结果:

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

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

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

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

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

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

 

总结

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值