“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
都找不到同名模块,就会报错,这是就需要主动把引用的目录加上