共计 1461 个字符,预计需要花费 4 分钟才能阅读完成。
导读 | 一般情况下,Python 模块导入推荐使用从根路径导入的写法,比如 Node.js 就使用相对路径的方式导入模块 |
例如
有如下目录
demo_project/ | |
module_a/ | |
file_a.py [func_a] | |
module_b/ | |
file_b.py [func_b] |
file_a.py
# -*- coding: utf-8 -*- | |
def func_a(): | |
print('func_a') |
file_b.py
# -*- coding: utf-8 -*- | |
from module_a.file_a import func_a | |
def func_b(): | |
func_a() | |
if __name__ == '__main__': | |
func_b() |
文件 module_b/file_b.py 中需要导入 module_a/file_a.py 中的函数 func_a
# 推荐 绝对导入 从顶层目录导入 | |
from module_a.file_a import func_a | |
# 不推荐 相对导入 | |
from ..module_a import func_a |
有时候在 PyCharm 中可以运行,而从命令行中直接运行却运行不起来
如果在 PyCharm 中运行文件,或者在项目目录下运行,都可以直接运行起来
cd demo_project | |
python3 module_b/file_b.py | |
func_a |
如果进入到 module_b 目录,运行 file_b.py,就会报导包错误
$ cd module_b | |
$ python3 file_b.py | |
Traceback (most recent call last): | |
File "file_b.py", line 2, in | |
from module_a.file_a import func_a | |
ModuleNotFoundError: No module named 'module_a' |
查看 PYTHONPATH 变量,发现当前目录是加入到环境变量里的
echo $PYTHONPATH | |
.: |
其实,一般我都会将当前运行的目录设置为环境变量
$ more ~/.bash_profile | |
export PYTHONPATH=.:$PYTHONPATH |
所以,只需要将项目目录加入到环境变量中可解决子目录中运行,导致找不到包的问题
# -*- coding: utf-8 -*- | |
import os | |
import sys | |
# 根据实际项目目录结构,将运行目录加入到环境变量中 | |
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |
# 注意,此处不要使用 append | |
sys.path.insert(0, BASE_DIR) |
加入环境变量完整代码
# -*- coding: utf-8 -*- | |
import os | |
import sys | |
# 根据实际项目目录结构,将运行目录加入到环境变量中 | |
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |
# 注意,此处不要使用 append | |
sys.path.insert(0, BASE_DIR) | |
from module_a.file_a import func_a | |
def func_b(): | |
func_a() | |
if __name__ == '__main__': | |
func_b() |
再次运行代码,可以成功调用
cd module_b | |
python3 file_b.py | |
func_a |
当然,正常情况下,从项目目录运行即可,不需要做单独的设置
正文完
星哥玩云-微信公众号
