导入错误:尝试使用未知的父包进行相对导入 :(

25

我试图从我的“Items”文件中导入脚本,但是一直出现错误。

from .Items.Quest1_items import *

提供

from .Items.Quest1_items import *
# ImportError: attempted relative import with no known parent package

# Process finished with exit code 1

这是我的项目结构,我正在从main.py文件运行脚本

Quest1/
|
|- main.py
|
|- Items/
| |- __init__.py
| |- Quest1_items.py

3个回答

24

去掉开头的点。相对路径将自动寻找 main.py

from Items.Quest1_items import *

15

你只能在导入的包中执行相对导入(即以点号开头)。例如,想象一下以下情况:

project/
├ main.py
├ mylib/
├ __init__.py
│ ├ module1.py
│ └ module2.py
main.py 文件中,你需要使用 import mylib 或者 from mylib import *, 但是在 module1.py 文件中,你可以使用 from . import module2,因为这里的点号代表 mylib(这是一个 Python 包,因为你在 main.py 中导入了它)。

所以,解决方案就是简单地去掉点号,在你的情况下它没有用处。


我有一个与你所说的完全相同的目录树,但我仍然得到了“ImportError: attempted relative import with no known parent package”。 - Reza
1
@Reza 我重新尝试了这个极简的例子(完全使用相同的文件和除导入之外的代码),它是可以工作的。为了找到问题的根源,请尝试通过删除部分来缩小程序的大小,直到您不再收到错误提示为止。如果您在出现问题的时候将情况详细描述,我可以提供更多帮助 (导入错误可能有很多不同的原因)。只是提醒一下,您的错误可能是由于在父级包之前导入了一个模块(例如,在导入mylib之前导入module1将无法正常工作,因为"."还没有意义)。 - jthulhu
对不起@BlackBeans,是我错了。我试图直接运行module1.py(python module1.py),但我忘记了应该像这样运行它:python -m mylib.module1 - Reza

7
简单来说,如果您使用相对导入,您可以在代码所使用的最外层文件的两个层级以上使用'python -m your_module_path'运行您想要的文件。
如下所示,如果您想运行run.py,则需要进入其上方的两个层级,然后运行python -m dir1.dir2.run(不带.py).
.../dir1/dir2/
    -test
        -test1.py
            from .test2 import *
        -test2.py
    -run.py
        from .test.test1 import *

4
另一个选择是“将您的代码转换为软件包”,这意味着以下所有步骤:1)在您的代码顶层目录中放置一个 __init__.py 文件 2)将顶层目录的父目录添加到您的 PYTHONPATH 中 3)在Python程序中设置__package__ 变量为包含 __init__.py 的目录名称。然后,您的代码将认为自己在一个软件包中,可以在不使用 -m 的情况下运行。 - AstroFloyd

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