Python import 不同层级的文件

Python 包含子目录中的模块方法比较简单,关键是能够在 sys.path 里面找到通向模块文件的路径。
网上比较好找到的,是下面几种情况:
(1)主程序与模块程序在同一目录下:如下面程序结构:
-- src |-- mod1.py -- test1.py
若在程序 test1.py 中导入模块 mod1, 则直接使用 import mod1from mod1 import *;
(2)主程序所在目录是模块所在目录的父(或祖辈)目录如下面程序结构:
-- src |-- mod1.py |-- mod2 | -- mod2.py -- test1.py
若在程序 test1.py 中导入模块 mod2, 需要在 mod2 文件夹中建立空文件 init.py 文件(也可以在该文件中自定义输出模块接口); 然后使用 from mod2.mod2 import *import mod2.mod2.
(3)主程序导入上层目录中模块或其他目录(平级)下的模块如下面程序结构:
-- src |-- mod1.py |-- mod2 | -- mod2.py |-- sub | -- test2.py -- test1.py
若在程序 test2.py 中导入模块 mod1 和 mod2。首先需要在 mod2 下建立 init.py 文件(同(2)),src 下不必建立该文件。然后调用方式如下:
下面程序执行方式均在程序文件所在目录下执行,如 test2.py 是在 cd sub; 之后执行 python test2.py 而test1.py 是在 cd src; 之后执行 python test1.py; 但是在 src 目录下执行 python sub/test2.py 或者 python src/sub/test2.py 会报错。
import sys sys.path.append("..") import mod1 import mod2.mod2
(4)但是很多项目里,是通过命令行执行完整路径的 py 文件,需要解决如上问题。
通过(3)可以看出,导入模块关键是能够根据 sys.path 环境变量的值,找到具体模块的路径。如果在 src 目录下执行 python sub/test2.py 要成功,就需要在 test2.py 中添加当前文件所在的绝对路径到 sys.path, 代码如下:
import os import sys sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),os.path.pardir))) import mod2.mod2
然后执行 python src/sub/test2.py 就能正常导入 mod2 并使用了

你可能感兴趣的:(Python import 不同层级的文件)