• python导包问题,这一篇就够了


    解决办法:

    将项目所在的根目录添加到sys.path中

    在入口文件中加入如下代码:

    import sys
    import os
    
    # 将 项目的根目录添加到sys.path中
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))    
    sys.path.append(BASE_DIR)
    
    # 导入包或模块
    from db.mysql.my_connect import connect

    一、背景

    最近在写Python自动化项目,遇到导包问题,明明导入了,运行时仍报 ImportError ,说明导包的姿势不正确。
    一个稍微复杂点的 Python 项目,都会有一定的目录结构,也就听上去高大上的框架结构,如下:
    PythonProjectDemo
    ├─bin
    │ main.py
    │ __init__.py

    ├─common
    │ __init__.py

    ├─db
    │ │ __init__.py
    │ │
    │ ├─mongo
    │ │ mongodb_connect.py
    │ │ __init__.py
    │ │
    │ └─mysql
    │ my_connect.py
    │ __init__.py

    └─view
    __init__.py

    目录说明:
    bin :程序运行入口
    common:通用包
    db:数据库相关包,下面又包含MySQL和mongo两个包
    view:视图包

    如果想在bin/main.py中导入db相关的模块,有的同学可能想这样写:
    from db.mysql.my_connect import connect
    无疑上面导入肯定会报错,因为main.py 和 db下的mysql不在同一个路径下。

    二、Python 导入模块工作原理
    Python 在导入模块时,会从一下路径进行查询:
    1、程序的主目录
    2、PTYHONPATH目录(如果已经进行了设置)
    3、标准连接库目录
    以上三个目录组成了一个list,可通过sys.path来查看
    在导包时就会从sys.path中进行搜索,如果搜索不到,则报ImportError

    sys.path输出如下

    [
        'H:PycharmProjectsuntitled4PythonProjectDemoin', 
        'E:pythonpython35python35.zip', 
        'E:pythonpython35DLLs', 
        'E:pythonpython35lib', 
        'E:pythonpython35', 
        'E:pythonpython35libsite-packages'
    ]

    所以直接通过 from db.mysql.my_connect import connect 是无法导入的

    三、解决办法
    思路:
    1、将需要导入的包或者模块添加到PTYHONPATH目录(不推荐)
    2、将需要导入的包或者模块添加到sys.path中
    在main.py中添加如下代码
    import sys
    sys.path.append(r"H:PycharmProjectsuntitled4PythonProjectDemo")
    from db.mysql.my_connect import connect
    运行未报错
    但是"H:PycharmProjectsuntitled4PythonProjectDemo"代码写死了,不灵活。在别的机器上可能就无法运行了
    我们可借助os模块动态获得项目路径
    __file__:运行文件的文件名,main.py

    os.path.abspath(path) 获取文件所在的绝对路径,
    os.path.abspath(__file__) # H:PycharmProjectsuntitled4PythonProjectDemoinmain.py
    os.path.dirname(p) 获取文件所在的目录
    os.path.dirname(os.path.abspath(__file__)) # H:PycharmProjectsuntitled4PythonProjectDemoin
    os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 获取项目根目录H:PycharmProjectsuntitled4PythonProjectDemo

    四、最终代码

    在main.py中的开始添加如下代码

    import sys
    import os
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))    
    sys.path.append(BASE_DIR)
    
    from db.mysql.my_connect import connect

    更多分享请关注微信公众号

  • 相关阅读:
    Linux find 用法示例
    [转载]进程的概念与结构
    linux vi命令详解
    vi快捷键必知必会
    vim分屏操作
    硬连接和软连接的区别
    javascript_console调试常用方法
    javascript_错误处理机制
    Array详解
    react--setState使用
  • 原文地址:https://www.cnblogs.com/yaoqingzhuan/p/10630894.html
Copyright © 2020-2023  润新知