当尝试在包内导入同级文件时,出现ImportError: attempted relative import with no known parent package错误。

4
我将尝试从我的一个项目中构建一个Python软件包。我的目录结构如下:
mypackage
    setup.py
    src
        __init__.py
        mypackage.py
        Node.py
        (... and a lot of other files and subdirectories)

在我的mypackage.py文件中,我使用以下方式导入Node类:
from .Node import Node

在以后导入mypackage的时候,为了使它们更容易使用,我们需要将它们和其他几个类直接访问。然而,在成功构建包之后(只需使用来自mypackage文件夹父目录的pip install "mypackage/"),当尝试在Python中导入该包时,我收到以下错误:

    from .Node import Node
    ImportError: attempted relative import with no known parent package

据我所知,mypackage.py应该绝对是包的一部分,所以我不太明白为什么它不能像这样导入兄弟模块。在setup.py文件中,我指定了:
from setuptools import setup
setup(
    <...>
    py_modules=['mymodule'],
    package_dir={'': 'src'}
)

这里我错过了什么?我对Python中的导入和模块系统并不了解。


如果你已经安装了这个软件包,并且想要访问Node模块中的Node对象,你应该使用 from mypackage.Node import Node,或者是我误解了问题?你不能使用相对导入来访问已安装软件包中的部分。 - GTBebbo
你如何运行mypackage.py?它是脚本还是模块?脚本不是包的一部分,不能在包中进行相对导入。 - tdelaney
@GTBebbo,“Node” 是我想要在使用“import mypackage as mp”之后访问的一组类中的一部分,使用“mp.Node”(直接而不必从实际的Node模块中导入)来访问。我认为这将是实现这一目标的自然方式。我不确定你所说的“我无法使用相对导入来访问已安装包的部分”是什么意思? - nutrx
@tdelaney 我根本没有运行 mypackage.py。我认为它只是一个文件,当导入包时,其内容实际上可以直接访问(请参见最后一条评论)。我错了吗? - nutrx
如果您的软件包名为mypackage,那么要访问mypackage.py文件,您需要使用mypackage.mypackage,通过使用mypackage.Node,您并不是在使用mypackage.py文件,而是告诉Python Node.py文件在哪个软件包中。 - GTBebbo
啊,我明白了。但是使用import mypackage.mypackage仍然导致相同的错误... - nutrx
1个回答

0

要进行导入,您只需要编写以下代码:

import Node

这是因为当您编写此代码时,

from .Node import Node

它认为你正在当前目录中寻找一个名为Node的目录,然后从那里导入Node文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接