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也能找到索引了,而不是报错索引不到了。