又一个导入错误:尝试相对导入,但没有已知的父包。

20 浏览
0 Comments

又一个导入错误:尝试相对导入,但没有已知的父包。

这个问题已经有答案了:

尝试使用没有已知父包的相对导入[重复]

Python 3中的相对导入

我有以下的目录结构:

py_test
├── __init__.py
├── dir1
│   ├── __init__.py
│   └── script1.py
└── dir2
    ├── __init__.py
    └── script2.py

script2中,我想要\"import ..\\script1\"。

我尝试在script2中的以下操作:

  1. 不可行

    from ..dir1 import script1
    ImportError: attempted relative import with no known parent package`
    

  2. 可行

    import sys, os
    path2add = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, 'dir1')))
    if (not (path2add in sys.path)) :
        sys.path.append(path2add)
    

如果我想采用选项1,使用最简单(即最少文件)的文件/目录结构是什么?

我知道这个,但我想知道是否可以避免创建该目录结构,仍然使用type-1 import

我目前正在使用这个解决方法,它使用type-2 import

相关:

如何导入位于上级目录中的Python类?

从一级目录(包)导入模块

在Python解释器中运行时出现“ImportError:尝试使用没有已知父包的相对导入”

使用 importlib 动态导入包含相对导入的模块

如何在不同的 Python 文件中导入变量

admin 更改状态以发布 2023年5月20日
0
0 Comments

如评论中所述,如果script2.py是你的入口点,则尝试导入一个目录可能不起作用。

你包含的这个链接所述:

如果模块的__name__不包含任何包信息(例如,它设置为__main__),那么相对导入将被解析为该模块是顶级模块,而不管该模块实际上在文件系统的何处。

如果模块是入口点,或者是您使用类似python script2.py的方式将其传递给解释器,则模块的__name__会被设置为__main__

因此,任何作为这样运行的Python模块都不再具有从更高目录导入文件所需的信息。

因此,您有两个选择:

选项1:继续使用带有sys.path.append的解决方法

这将按您希望的方式工作,但相对复杂。

选项2:将入口点设置为顶级

假设你的包有多个需要运行的脚本,你可以创建一个新文件,导入script1script2,然后根据命令行参数调用所需功能。这样,您就可以保持当前的目录结构,并使您的相对导入正常工作,而不需要任何与sys.path的纠缠。

0