我有这个文件设置:
mainfolder:
__init__.py
mainfile.py
subfolder1:
file1.py
__init__.py
subfolder2:
file2.py
__init__.py
我需要将mainfile.py导入到file1.py和file2.py中。目前我正在使用:
from .. import mainfile
然而,这会带来错误:尝试相对导入超出顶级包。
我也尝试过:
from ...mainfolder import mainfile
它会显示相同的消息,并且:
from mainfolder import mainfile
其中包含错误消息:没有名为' mainfolder'
的模块在__init __.py文件中我有这段代码:
__all__ = [list of files in package]
我不确定为什么这不起作用。如果有人能解释我做错了什么,我将不胜感激。
编辑:错误"尝试相对导入超出顶级包"我跑的时候发生了:
from .. import mainfile
在文件1中。
答案 0 :(得分:0)
使用包时,Python要求定义__package__
变量以理解相对导入。
当您致电python mainfolder/subfolder2/file2.py
时,它只是像脚本一样执行file2.py
- 并且,如果没有__package__
,则无法执行任何相对导入。
当您致电python -m mainfolder.subfolder2.file2
时,您实际上是在告诉Python,"请执行包file2
的子包subfolder2
中的子模块mainfolder
",所以它为你设置__package__
,一切正常。
请参阅this answer进行更深入的讨论。
答案 1 :(得分:0)
您不能在被调用的脚本之上进行相对导入。
当您无法将脚本作为模块运行时,我发现修复该错误的最佳方法是在文件的开头添加import sys; sys.path += ['../']
。这会将父目录添加为查找模块的位置之一,因此您可以只import mainfile
。如果要导入的模块位于文件系统中的其他位置,也可以将['../']
更改为指向包含要导入的模块的目录的相对路径。