Python包的相对导入时出现“ ‘Parent module ' not loaded, cannot perform relative import”的解决方法

  在练习Python中package的相对导入时,即

from . import XXX

  或者 

from .. import XXX

  时会遇到这样两个错误:

SystemError: Parent module ‘‘ not loaded, cannot perform relative import

  和

ValueError: attempted relative import beyond top-level package

  其实这两个错误的原因归根结底是一样的:在涉及到相对导入时,package所对应的文件夹必须正确的被python解释器视作package,而不是普通文件夹。否则由于不被视作package,无法利用package之间的嵌套关系实现python中包的相对导入。

  文件夹被python解释器视作package需要满足两个条件:

  1、文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。

  2、不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)。

  补充:在"from YY import XX"这样的代码中,无论是XX还是YY,只要被python解释器视作package,就会首先调用该package的__init__.py文件。如果都是package,则调用顺序是YY,XX。

  另外,练习中“from . import XXX”和“from .. import XXX”中的‘.‘和‘..‘,可以等同于linux里的shell中‘.‘和‘..‘的作用,表示当前工作目录的package和上一级的package。

  举个例子:

  目录树

  testIm/

  --__init__.py

  --main.py : from Tom import tom

  --Tom/

    --__init__.py : print("I‘m Tom‘s __init__!")

    --tom.py : from . import tomBrother, from .. import Kate,print("I‘m Tom!")

    --tomBrother.py print(I‘m Tom‘s Brother!)

  --Kate/

    --__init__.py : print("I‘m Kate‘s __init__!")

    --kate.py

  运行文件:main.py

  结果:

I‘m Tom‘s __init__!
I‘m Tom‘s Brother!
Traceback (most recent call last):
File "D:\PythonLearning\TestIm2\main.py", line 3, in <module>
from cat import cat
File "D:\PythonLearning\TestIm2\cat\cat.py", line 4, in <module>
from .. import dog
ValueError: attempted relative import beyond top-level package
>>>

可以看到from . import tomBrother顺利执行,首先执行了Tom文件夹下的__init__.py文件,后来执行了tomBrother.py文件,但是当执行到“from .. import dog”时报错,这是因为我们是在TestIm文件夹下把main.py文件作为主函数的入口执行的,因此尽管TestIm文件夹中有__init__.py文件,但是该文件夹不能被python解释器视作package,即Tom package不存在上层packge,自然会报错,相对导入时超出了最高层级的package。

修改方法:

目录树

  test/

  --main.py : from testIm.Tom import tom

  --testIm/

    --__init__.py

    --Tom/

      --__init__.py : print("I‘m Tom‘s __init__!")

      --tom.py : from . import tomBrother, from .. import Kate,print("I‘m Tom!")

      --tomBrother.py print(I‘m Tom‘s Brother!)

    --Kate/

    --__init__.py : print("I‘m Kate‘s __init__!")

    --kate.py

  运行文件:main.py

结果:  

I‘m top‘s __init__!
I‘m Tom‘s __init__!
I‘m Tom‘s Brother!!
I‘m Kate‘s __init__!
I‘m Tom!

即主函数入口不在TestIm中,则TestIm和其同样包含__init__.py文件的子文件夹都被python解释器视作package,形成相应的嵌套关系。可以正常使用from . import XXX和from .. import XXX。

Python包的相对导入时出现“ ‘Parent module ' not loaded, cannot perform relative import”的解决方法

时间: 2024-10-24 12:30:01

Python包的相对导入时出现“ ‘Parent module ' not loaded, cannot perform relative import”的解决方法的相关文章

下级引用上级(相对导包):SystemError: Parent module &#39;&#39; not loaded, cannot perform relative import

当在下级中引用上级时,使用相对导包会出错,SystemError: Parent module '' not loaded, cannot perform relative import 运行test_count.py文件 解决方案:在test_count.py文件中加入如下代码,将上上级路径加入到环境变量中,这样引包就不会报错了 import os import sys path = os.path.dirname(os.path.dirname(os.path.abspath(__file_

Python 包的相对导入讲解

[Python 包的相对导入讲解] 参考:http://www.dai3.com/python-import.html

导入数据库出现html lang=&#39;zh&#39; dir=&#39;ltr&#39; class=&#39;ie ie7错误代码解决方法

今天遇到一个客户导入数据库错误的问题,导入后出现错误代码如下: <!DOCTYPE HTML><html lang='zh' dir='ltr' class='ie ie7'><meta charset="utf-8" /><meta name="robots" content="noindex,nofollow" /><meta http-equiv="X-UA-Compatibl

服务器直接关机,再开机,硬重启时把数据库搞坏了,状态为“可疑”的解决方法

服务器放的网站都正常,就是远程连不上,着急改点东西,就让机房的人把服务器重启了一下,那边一般都是直接关机,再开机,硬重启. 之前也一直没有出现过异常,但今天硬重启了以后,发现网站出错,一看原来是数据库状态为“可疑”,不能用了,真是吓我一跳,第一次遇到这种问题. 在网上搜了一下,找到解决方法,管用,挺好的,记录一下. 首页把iis及一些连数据库的服务停掉,80和1433端口在防火墙里面也禁止连接,意思就是不让访问,要不会影响执行速度. 把DbName换成坏掉的数据库名,当前数据库选Master,步

MySQL登录时出现Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)解决方法

本人配置:系统64位win10,MySQL8.0.16 错误 :ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES) 从上面这段英文的意思来看,可以这样分析,第一:Access denied(拒绝访问):第二:using password:NO/YES.这里这个using password 的是是否输入了密码,输入了就表示YES,没有就输出NO. 根据网上查了很多资料,出现Acces

python包与模块导入

一 .module 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc".".pyd".".so".".dll". 二. package 通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块.包目录下为首的一个文件便是 __init__.py.然后是一些模块文件和子目录,

IN 查询时出现ORA-01795:列表中的最大表达式数为1000解决方法

问题描述: SQL进行IN查询时出现:java.sql.SQLException: ORA-01795: 列表中的最大表达式数为 1000 解决办法: 问题原因是:SQL进行IN查询时,IN中的数据量不能超过1000条. 例如:select * from student where id in ('S1','S2'...........) 如果in后面数据量过多的话就会报错. 解决方法是:用 or关键字 如:select * from student where id in('S1','S2',

ValueError: Attempt to reuse RNNCell &lt;tensorflow.contrib.rnn.python.ops.core_rnn_cell_impl.BasicLSTMCell object at 0x7f1a3c448390&gt; with a different variable scope than its first use.解决方法

最近在做生成电视剧本小项目,遇到以下报错 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-16-a2d9a7091ca5> in <module>() 10 input_data_shape = tf.shape(input_text) 11 cell, ini

安卓(android)建立项目时失败,出现Android Manifest.xml file missing几种解决方法?(总结中)

安卓(android)建立项目时失败.出现AndroidManifest.xml file missing几种解决方法?(总结中) Eclipse新建项目.遇到这种问题.注意例如以下: 1.文件名称最好不要用中文. 2.文件夹也不要用中文. 3.这个不会出错,但出于程序编写习惯.第一个字母最好为大写.