目录
代码目录结构
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都是relative_path根目录。因为python命令在这个目录下执行
可见:在test_12子目录下无法直接找到test_0.py。
可见:不管被执行文件在哪个目录中,只要在test_12子目录执行命令,cwd就是test_12子目录;
也可见得:sys.path[0]是被执行文件的所在目录,与在哪个目录执行文件没关系,只由被执行文件所在目录决定
接下来,我们看看这两个路径中,哪个对import的相对路径有关。我们把每个py文件中加入import其他module的代码(以test_0.py为例)
假设:如果module的相对路径也是由cwd决定,那么在test_12目录执行命令,应该可以直接import test_12,测试结果如下:
Uh-oh,发现找不到test_12,这说明import module的相对路径不是由cwd决定
那相对路径的起点是由sys.path[0]决定吗?我们做几个实验
实验结果OK
这个实验是认为sys.path中含有relative_path根目录,所以推断应该可以看见relative_path中的模块folder_1
实验结果也是OK的:
这个实验将待导入模块的目录加入sys.path中,使得test_12 module 可见
以上两个实验,说明了import module时,相对路径的起点由sys.path决定,也就是被执行的文件所在目录决定。
如果待导入的module对于被执行文件所在目录不可见,则用sys.path.append添加路径
为了验证我们的结论是否可靠,我们做一个实验
原始代码test_12.py:
推断:因为被执行文件在test_12目录中,test_0在根目录中,是不可见的,所以这样应该会报错。实验结果:
所以,我们应该把根目录加入sys.path中:
而且修改后,运行OK。说明我们上面的结论有效!
看网上有在import中直接带上..表示相对路径的,我也试试(只导入上一级的test_11):
import .. test_11
import . test_11
from .. import test_11
from . import test_11
这几种方法都不行,我是没搞定这种方法。
另一种修改,在sys.path.append中新增的路径能不能不用绝对路径?也用相对路径?
我推断这里的相对路径是文件的相对路径,不是import的相对路径,所以,又和cwd相关了。所以在test_12目录下执行命令的话,应该修改为:
看下实验结果:
实验是这样的:test_12.py为了导入test_0.py,需要加入如下目录
如果被导入的test_0.py中也添加了路径:
此时打印出的路径中,是只能见到yy呢?还是两个新增的路径都能见到?实验结果
你看,是所有新增的搜索路径都可以见到。这会不会有隐患呢?
用假设-实验的方法,证明了,python3中用相对路径执行、索引某个文件,起点由cwd决定,可由os.getcwd()获取;
用相对路径import module,相对路径的起点由sys.path决定。