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:\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

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

转载于:https://www.cnblogs.com/yaoqingzhuan/p/10630894.html

在Linux中,使用pip是一种常见的方式来安装和管理Python包。你可以通过以下命令来安装pip: ``` sudo apt-get install python-pip ``` 这将在你的系统中安装pip工具。 当你遇到导包问题时,可以考虑以下几个解决方案: 1. 确保安装了需要的Python包,可以使用pip来安装缺失的包。例如,如果你需要安装numpy包,可以使用以下命令: ``` pip install numpy ``` 2. 检查你的Python版本,有时候不同的Python版本可能会导致导包问题。你可以尝试更高版本的Python来解决问题。例如,你可以升级到Python 3.7.7版本。 3. 修改相关的Python文件。有时候,你可能需要修改某个Python文件来解决导包问题。你可以根据具体情况修改文件中的导包语句或相关配置。 这些是解决在Linux中导包问题的常见方法。你可以根据具体情况选择适合你的解决方案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux系统如何查看已安装的python包 -- 导出项目使用的依赖包](https://blog.csdn.net/qq_40671063/article/details/125864237)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux【Ubuntu18.04】python3.7 导包报错:No module named ‘_lzma’](https://blog.csdn.net/weixin_45835541/article/details/127101291)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值