我有这个文件设置:
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中。
使用包时,Python要求定义__package__
变量以理解相对导入。
当你调用python mainfolder/subfolder2/file2.py
时,它只是像脚本一样执行file2.py
- 并且,如果没有__package__
,则无法执行任何相对导入。
当你打电话给python -m mainfolder.subfolder2.file2
时,你实际上是在告诉Python,“请执行包file2
的子包subfolder2
中的子模块mainfolder
”,所以它为你设置了__package__
,一切正常。
请参阅this answer进行更深入的讨论。
您不能在被调用的脚本上方执行相对导入。当您无法将脚本作为模块运行时,我发现修复该错误的最佳方法是在文件的开头添加import sys; sys.path += ['../']
。这会将父目录添加为查找模块的位置之一,因此您可以只使用import mainfile
。如果要导入的模块位于文件系统中的其他位置,这也适用,只需将['../']
更改为指向包含要导入的模块的目录的相对路径即可。