又一个导入错误:尝试相对导入,但没有已知的父包。
又一个导入错误:尝试相对导入,但没有已知的父包。
这个问题已经有答案了:
我有以下的目录结构:
py_test ├── __init__.py ├── dir1 │ ├── __init__.py │ └── script1.py └── dir2 ├── __init__.py └── script2.py
在script2
中,我想要\"import ..\\script1
\"。
我尝试在script2
中的以下操作:
- 不可行
from ..dir1 import script1 ImportError: attempted relative import with no known parent package`
- 可行
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解释器中运行时出现“ImportError:尝试使用没有已知父包的相对导入”
admin 更改状态以发布 2023年5月20日
如评论中所述,如果script2.py
是你的入口点,则尝试导入一个目录可能不起作用。
如你包含的这个链接所述:
如果模块的
__name__
不包含任何包信息(例如,它设置为__main__
),那么相对导入将被解析为该模块是顶级模块,而不管该模块实际上在文件系统的何处。
如果模块是入口点,或者是您使用类似python script2.py
的方式将其传递给解释器,则模块的__name__
会被设置为__main__
。
因此,任何作为这样运行的Python模块都不再具有从更高目录导入文件所需的信息。
因此,您有两个选择:
选项1:继续使用带有sys.path.append
的解决方法
这将按您希望的方式工作,但相对复杂。
选项2:将入口点设置为顶级
假设你的包有多个需要运行的脚本,你可以创建一个新文件,导入script1
和script2
,然后根据命令行参数调用所需功能。这样,您就可以保持当前的目录结构,并使您的相对导入正常工作,而不需要任何与sys.path
的纠缠。