__初始化文件不';在python中无法按预期工作

__初始化文件不';在python中无法按预期工作,python,init,Python,Init,我有一些文件夹和.py文件,其结构如下: parent/ __init__.py test.ipynb code/ __init__.py common.py subcode/ __init__.py get_data.py 在parent文件夹下的\uuuuu init\uuuu文件中,我有impor

我有一些文件夹和
.py
文件,其结构如下:

parent/
       __init__.py
       test.ipynb
       code/
            __init__.py
            common.py
            subcode/
                    __init__.py
                    get_data.py
parent
文件夹下的
\uuuuu init\uuuu
文件中,我有
import code
,在
code
之一中,我有
import subcode
。但是当我尝试导入code.subcode时,我遇到了这样一个错误:

ImportError: No module named 'code.subcode'; 'code' is not a package
但是,当我只导入代码时,不会抛出任何错误。但是,当我调用
code.subcode
时,会发生以下错误:

AttributeError: module 'code' has no attribute 'subcode' 
我在
test.ipynb
中尝试了上面提到的所有内容,它位于目录的根目录下


你知道原因是什么吗?我该如何解决?谢谢

问题是您正在导入另一个名为
code
的模块,该模块安装在您的系统上,而不是您自己的模块上。您可以通过在导入代码后检查
代码中的模块文件路径来验证这一点

首先要做的是更改模块的名称,以避免与系统上的另一个
code
包发生命名空间冲突。如果您的新包名没有与其他名称冲突,那么您现在应该要么成功导入它并使其按预期的方式运行,要么完全导入失败

如果导入失败,很可能是因为
parent
目录不在
PYTHONPATH
环境变量中


解释器无法识别模块可能还有其他更为技术性的原因,例如缓存了旧定义(在这种情况下,重启解释器通常就足够了。可能是在删除模块的任何预编译版本之后)。我看到的另一个问题是,模块中包含一个bug,使得解释器无法解析它。我确信还有其他奇怪的可能性。

您使用的是Python 3。您需要显式执行相对导入:

from . import code

您当前获得的
code
模块是标准的库模块。

试着将您的
\uuu init\uuuuuuuuupy
文件保留为空。@DrK同样的事情发生了…….在导入
code
之后,
code.\uuuuuuu文件\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>指向您期望的目录?@Dr.k哦,真的不。。。。。。。它指向
'/home/lcc/anaconda3/envs/parent/lib/python3.5/code.py'
。为什么会发生这种情况……我猜您的
PYTHONPATH
环境变量不包含您的
parent
目录,如果包含,那么它在列表中的位置将低于您实际导入的
code
模块的路径。解决方案:将
parent
添加到
PYTHONPATH
中,并可能使用与
code
不同的名称以避免名称空间冲突。但是在搜索
PYTHONPATH
之前,不应该在当前目录(parent/)中找到
code
?请参阅:
parent
是一个包,因此
parent
目录本身可能不应该位于
PYTHONPATH
上;包含
parent
目录的目录应该在那里。@user2357112是的,我也这么想,但从他导入的方式来看,似乎更像是他要将
code
作为包。但你是对的。@孙庆尧你是对的。他可能也在错误的目录中。我对你的评论投了赞成票。