python 相对路径导入包
这个是参考网上的做法,终于成功学会
核心思想:python在运行脚本的时候,会把当前路径设为main,无法通过相对路径访问上级目录,仅可访问当前目录及其子目录
问题引入
在构建python项目时,总是想import当前项目下的某些文件,有的时候我们的引入没有问题。
如上图,我们要运行dir_1目录下dir_1_run.py文件,如果该文件import了dir_1/file_1.py 或者 dir_1/dir_1_1/file_2.py, 没有问题,能成功。不成功的话在dir_1和dir_1_1目录下新建个__init__.py 文件。代码如下:
# not recommend import file_1 import dir_1_1.file_2 # recommend from file_1 import func_1, ... from dir_1_1.file_2 import func_2, ...
但是当引用dir_2.file_1.py时,我们不能用 ..dir_2.file_1 这个路径import,Error,main没有..这个东西。(绝对路径忽略我)代码如下:
from ..dir_2/file_2 import func_3, ...
法一(不推荐)
一般的做法,也是我之前用的,代码如下:
# 手动将上级目录导入系统路径 import sys sys.path.append('..')
每个有这种需求的运行时脚本,都会在最前面写上这段代码,能不能不写?
法二
将dir_1_run.py 中要运行的代码独立成一个函数,然后新建一个run.py,就可以了。
# in dir_1/dir_1_run.py from dir_2.file_2 import func_1 def func(): pass
# in run.py from dir_1.dir_1_run import func
if __name__ == 'main': func()
Why?
实际上,在运行run.py 的时候,系统的work directory就是run.py所在的路径'.'。
在from dir_1/dir_1_run import func后,dir_1/dir_1_run.py 中 from dir_2.file_2 import func_1是在'.' 下执行的,那么自然能够找到dir_2文件夹及其目录下的文件。
原理
在运行脚本时,系统会假设当前路径名为'main',并不是'/dir_A/dir_B/'。
python找不到'/'这个符号,他就报错了。'..'这个操作就无法运行了。
合理的做法
在项目的最上层目录,建立需运行脚本,不要在某个目录下建小脚本,除非确定当前及以后用不到其他目录下的内容。
这时任何python代码文件引入其他python代码文件及访问data代码如下:
from dir_1.code_1 import ... from dir_1_1.code_1_1 import from dir_2.code_2 data_path_1 = './dir_1/dir_1_1/data' data_path_2 = './dir_2/data'
因为我们知道,当前的工作路径一定是'.',所以这就是合理的引用方式。
在 code_1_1.py 中访问 dir_1/dir_1_1/data 也一定是这么引用的,而不是'./dir_1_1/data'
这时,你会发现,如果打开目录在'.'的话,pycharm也能找到索引了,而不是报错索引不到了。