-
文档地址
doc01
-
出错信息:
cannot import name 'm2' from '__main__'
-
目录结构
-
分析
这里使用显式相对导入,直接运行代码会出错,如果使用隐式相对导入 import m2 ,pycharm上面显示出错,但是实际执行是没错的。pep8推荐使用绝对导入,可用 from pro1 import m2
在没有明确指定包结构的情况下,Python 是根据
__name__
来决定一个模块在包中的结构的,如果是
__main__
,则它本身是顶层模块,没有包结构,如果是A.B.C 结构,那么顶层模块是 A。
基本上遵循这样的原则:
如果是绝对导入,一个模块只能导入自身的子模块或和它的顶层模块同级别的模块及其子模块
如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块
如果一个模块被直接运行,则它自己为顶层模块,不存在层次结构,所以找不到其他的相对路径。
-
总结
虽然直接执行m1.py文件,from . import m2 语句会报错,但是如果在另外的文件中导入m1文件,是没错的。首先推荐使用绝对导入,其次使用显式相对导入
-
模块搜索路径
当一个名为 spam 的模块被导入的时候,解释器首先寻找具有该名称的内置模块。如果没有找到,然后解释器从 sys.path 变量给出的目录列表里寻找名为 spam.py 的文件。
sys.path 初始有这些目录地址:
包含输入脚本的目录(或者未指定文件时的当前目录)。
PYTHONPATH (一个包含目录名称的列表,它和shell变量 PATH 有一样的语法)。
取决于安装的默认设置
在有些时候,python脚本在运行的时候会显示“cannot import name”错误,但是你反复检查了引入的模块以及模块内的内容,都是没问题的,但是还是不能正常地引入,这种情况又该如何解决呢?
像这种情况,如果不是环境问题的话,那就是文件名命名的问题。
比如说,你创建了一个名为“pyecharts.py”的文件,然后文档中有这样的语句:
from pyecharts import Map
......
cannot import name 'xxxx' from '__main__'
包内的文件相互导入分两种,用绝对路径和相对路径,用.或者…都是第二种,相对路径。
重点是,相对导入的路径依赖于当前模块的_name_,是根据它的值去找平级或者上级文件。
通过print(name)可知当前文件名为__main__
所以说,从物理上来说,这两个文件确实都在同一个目录下,但仅此就认为from . impo
首次使用AI STUDIO python导包出错
第一次用AI studio,很多地方不适应。
按照 https://github.com/PaddlePaddle/PaddleDetection/ 下载安装paddledetection,在验证的时候出错,找不到某些paddle的模块,最后发现我可能是setup和pip install都安了一遍,导致环境下有重复的包,然后出错了,找到site-package下面报错的包,删掉就ok了,犯我这个错误的好像很少hhh,就简单记录一下。
报错界面:
报错描述:一开始是没用问题的,后来把该app移入设置的根目录apps里,又取出来,就报了改错。
解决:其实对于我来说这个错误很简单,语法问题(原来错误写法:from credit import index3;改正:from credit.views impot index3)。
其实它也提示清楚了,是导入错误,但是由于一,我之前运行的是好的,后来进行了一些操作,难免把错误和这部操作联系起来,二是,网上很多报和我一样的错误,但造成的原因的解决的方法各有不同,导致我更加困惑。
以后报错检查,对于我这
urlpatterns = [
# 登录页面
url('login/', login, {'template_name': 'users/login.html'}, name='login'),
报错:ImportError: cannot import name ‘login’
官网地址:https://www.catalyzex.com/这里我选择作为Chrome插件进入 Google、ArXiv、Twitter、Github等等页面检索,如果存在匹配的代码,就会自动显示例如进入ArXiv:https://arxiv.org/任意检索内容,发现如果存在代码,将会有相关显示...