“Better code, better life. ”
python导入自定义包报错
-
问题描述
工作需要上需要把一堆python脚本整理成一个项目,但事实上每个脚本依然是独立运行的,所以只能把脚本中用到的公共模块抽出来,作成公共方法,整理后目录结构大概是这样:
|--project | |--script_dir | | |--script.py | |config.py | |__init__.py__init__.py内容如下from .config import connect这时候如果想在
script.py里调用上级目录的connect方法,在script.py里这么写from project.config import connect connect()这个语法在PyCharm下并不会报错,但是运行就会报:
ImportError: No module named config
-
解决方案
在import之前把上级目录加到
PYTHONPATH中import sys import os sys.path.append("..") from .config import connect connect() -
问题原因
python在执行一个文件时,无论执行方式是绝对路径还是相对路径,解释器都会把文件所在的目录加入到系统查找路径中,也就是
sys.path这个list,而sys.path又是由python的环境变量决定的。可执行文件的所在文件夹会首先被加到
sys.path的首位,也就是sys.path[0]。而解释器在执行时,首先会搜索
build-in module。其次才会搜索sys.path包含的路径。所谓的build-in module就是运行的项目模块。这种特性这会引起同名包被覆盖的问题。回到上面报错的原因,其实就是python解释器搜索导入模块时
系统包-->同目录-->sys.path都找不到同名模块,就会报错,这是就需要主动把引用的目录加上