crm开发定制Python from import导包ModuleNotFoundError No module named,找不到模块问题



在学习Flaskcrm开发定制框架的蓝图时,crm开发定制遇到导包时用到了`from . 模块 import 对象`,crm开发定制然后试了试直接 import会报错,crm开发定制直接告诉我找不到模块,crm开发定制发现问题以此记录。

场景

有一个flaskcrm开发定制框架的项目,目录结构如下:

有一个主包pro_flask,然后下面有两个子包admin和web,还有和pro_flask同级的启动文件

我在与admin和web同级的__init__.py文件中,导入admin和web里的一些资源。

代码如下:

在导入admin和web中的资源时,告诉我ModuleNotFoundError: No module named 'admin'

from flask import Flask# 以下 import的admin和web,是admin和web包下__init__.py中定义的对象from admin import admin		# 项目启动后,这里会报错from web import web		# 项目启动后,这里会报错
  • 1
  • 2
  • 3
  • 4
  • 5

admin包下的__init__.py文件

from flask import Blueprintadmin = Blueprint(				# 需要在其他模块中导入这个 admin 蓝图对象    'admin',    __name__,    template_folder='templates',    static_folder='static')from . import views
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

web包下的__init__.py文件

from flask import Blueprintweb = Blueprint(				# 需要在其他模块中导入这个 web 蓝图对象    'web',    __name__,    template_folder='templates',    static_folder='static')from . import views
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

了解下import和from …import区别

参考的网上大佬的笔记

import

import tkinter
  • 1

(1)引用包
import引入的是包中根目录下__init__.py中的全部内容,包括其中的类、类内部的公有属性、类内部的公有方法、方法等内容.(该种方式导入包的本质就是执行__init__.py文件)

(2)引用模块
(该种方式导入模块的本质是将模块解释执行一遍,并赋值给tkinter: module_name = “module_name.py all code”)

===> import module_name —> module_name.py —> module_name.py的位置 —> sys.path(本质是一个列表)

from…import

(1)引用包
(from … import …引入的是在包中根目录下__init__.py和某个文件的内容)但是,我们知道,导入包是没有意义的,最终的目的是导入包下面的模块。(该种方式导入包)

(2)引用模块
(该种方式当如模块的本质是讲module_name.py文件掰开,把想要的部分放入当前文件执行一遍。)

分析

看了网上大佬的分析以及解决方案,自己分析下

一般情况下,python会把一些默认的包目录和用户自定义包所在的目录加载到python的搜索模块的路径集中(sys.path,是一个list列表),然后用户在进行导包时,python会去搜索的模块路径集中去寻找,所导入包的所在目录是否在这个搜索的模块路径集中,如果不存在,那么就会抛出异常找不到模块。

代码分析:启动类中,我们打印一下python搜索的模块路径集

from pro_flask import appimport sysprint(sys.path)if __name__ == '__main__':    app.run()-------------------------------------------------------['D:\\environment\\python-workspace\\flaskProject', 'D:\\environment\\python\\DLLs', 'D:\\environment\\python\\lib', 'D:\\environment\\python', 'D:\\environment\\python-workspace\\flaskProject\\venv', ........]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注意列表中这个'D:\\environment\\python-workspace\\flaskProject',就是上面截图中项目所在的路径。

结论:也就是说,这个项目所在目录被加载到了python的搜索模块路径集中,所有导入包的操作都必须要从项目的目录开始找,否则就会出问题

解决方案

方案一(绝对路径)

导入模块时,从项目的根目录找起

from flask import Flaskfrom pro_flask.admin import admin	# 从项目根目录下找起就可以from pro_flask.web import web
  • 1
  • 2
  • 3
  • 4

方案二(相对路径, 推荐)

导入时,使用 . 表示从当前文件所在目录找

from flask import Flaskfrom . admin import admin	# 从当前文件所在目录下开始找from . web import web
  • 1
  • 2
  • 3
  • 4

同理,如果从上级目录开始找,那么可以用

from .. xxx import xxx
  • 1

参考

参考自


网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发