工作问题记录--python导入自定义包报错

"Python"

Posted by Simon on March 2, 2020

“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
    

    都找不到同名模块,就会报错,这是就需要主动把引用的目录加上