解决办法:

将项目所在的根目录添加到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:\PycharmProjects\untitled4\PythonProjectDemo\bin',
'E:\python\python35\python35.zip',
'E:\python\python35\DLLs',
'E:\python\python35\lib',
'E:\python\python35',
'E:\python\python35\lib\site-packages'
]

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

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

os.path.abspath(path) 获取文件所在的绝对路径,
os.path.abspath(__file__) # H:\PycharmProjects\untitled4\PythonProjectDemo\bin\main.py
os.path.dirname(p) 获取文件所在的目录
os.path.dirname(os.path.abspath(__file__)) # H:\PycharmProjects\untitled4\PythonProjectDemo\bin
os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 获取项目根目录H:\PycharmProjects\untitled4\PythonProjectDemo

四、最终代码

在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

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

python导包问题,这一篇就够了的更多相关文章

  1. python导包学习总结

    python初学者,对于导包纠结了不少时间,总结分享,持续前进~ Python导包的两种方法: 1.1  from 包.模块  import 方法名,调用时直接使用方法名() 1.2  from 包. ...

  2. python导包显示No module named XXX问题

    最近用sublime text写python脚本,在导包是一直显示No module named XXX. 问题描述: 首先文件夹的目录结构如下: count.py文件,代码如下: #coding=u ...

  3. python导包语句执行

    今天在做项目中遇到一个问题,在first_page中引用login的登录方法,第一次执行登录可以正常登录,登录成功后,再选择返回主菜单,回到上个页面,再选择登录时报错“login_class isno ...

  4. 记一次Python导包经历

    最近由于需要写一个脚本调用另一个文件里面的一个方法,试了很久都导包失败,特此记录一下 问题背景 1)脚本文件为send_reward.py,要调用public_model_func.py里面的一个类方 ...

  5. python导包

    我们将完成特定功能的代码块放在一个.py结尾的文件中,这个文件被称为模块.在这个模块中可能包含变量,函数,类等等内容. 当我们从外部需要用到这个模块时,就需要将这个模块导入到我们当前环境.导入方式有以 ...

  6. python导包路径的修改

    1.sys os 模块 import sys import os 2.查看默认的导包路路径: print(sys.path) 3.路径拼接 os.path.join(url, 'apps')) 4.追 ...

  7. python导包一不小心就入坑(常用解决办法)

    常见导包报错: - ImportError:No module named - SystemError: Parent module '' not loaded, cannot perform rel ...

  8. 太酷炫了!!我会Python 导包八种方法,你呢?

    1. 直接 import 人尽皆知的方法,直接导入即可 >>> import os >>> os.getcwd() '/home/wangbm'复制代码 与此类似的 ...

  9. python导包踩过的坑之包名和模块名同名

随机推荐

  1. [转帖]“腾百万”之后,腾讯的云操作系统VStation单集群调度达10万台

    “腾百万”之后,腾讯的云操作系统VStation单集群调度达10万台 https://www.leiphone.com/news/201909/4BsKCJtvvUCEb66c.html 腾讯有超过1 ...

  2. 定时任务-SQL Server代理 作业

    创建一个sqlserver作业 sqlserver的作业的功能更加偏向于数据库,处理数据,迁移等.当然也可以调用接口(存储过程调用接口  https://www.cnblogs.com/cynchan ...

  3. maven基础和基本使用

    maven介绍 Maven是基于项目对象模型(POM project object model)实现的,可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具. 具体作用: 项目 ...

  4. Sublime实现自动排版

    sublime功能很强大, 但是使用sublime就可以实现代码自动重新缩进,使代码缩进重排 方法:Ctrl+A选中全部内容,然后在菜单中选择Edit->Line->Reindent

  5. TZOJ3133: 求对称点

    #include<stdio.h> int main() { double a,b,c,d,e,f,g,h,i; while(~scanf("%lf %lf %lf %lf %l ...

  6. VC串口通讯,WriteFile或ReadFile没有任何返回??

    别犯低级错误,一定要设置读写超时!!!

  7. 区块链公链分片技术(sharding)方案思维导图

  8. Python 练习汇总

    1. Python练习_Python初识_day1 2. Python练习_Python初识_day2 3. Python练习_初识数据类型_day3 4. Python练习_数据类型_day4 5. ...

  9. ext TreePanel树节点操作

    1.全部展开 tree.expandAll();2.全部收缩 tree.collapseAll();3.得到父节点 node.parentNode4.判断是否有父节点 node.parentNode= ...

  10. python day1 python介绍,安装及运算符

    目录 python day1 1. 不同编程语言的对比 2. 为什么学python? 3. python的种类 4. python的安装(windows系统) 5. 导入模块或包 6. pyc文件 7 ...