我正在努力一致地导入我用python编写的模块,使用Spyder IDE设置到我的顶级python脚本的目录中。以下是我的文件结构,基于this指南。
root_folder/
submodules
moduleA/
data/ # contains input Excel files
output/ # contains output files
code1.py
moduleB/
data/
output
code2.py
main.py
code3.py
在main.py
中,我试图用from .submodules.moduleA import code1
导入code1.py
,但是我得到了这个错误:"No module named '__main__.submodules'; '__main__' is not a package"
我还尝试从main.py
导入code3.py
,为此我尝试使用from . import code3
,但得到了一个与以前类似的错误:cannot import name 'code3' from '__main__' (unknown location)
给定我的文件结构,我应该使用什么命令来相对导入我的模块?
发布于 2020-08-10 20:55:56
python的一个具有挑战性的概念是,您运行的顶级脚本不是模块*,也不在包中。例如,您会注意到顶级脚本始终是__name__ == __main__
。这与操作系统程序密切相关,其中可执行文件位于PATH
中,但它们加载的库位于系统定义的LIB
路径中。其思想是python模块和包由所有脚本共享,无论它们在哪里。
为了迎合人们对实际捆绑和安装python包的反感,python将脚本的目录添加到其模块路径中。这使得与脚本对等的.py文件可以导入模块和任何子目录,潜在地可以导入包。这是有风险的业务,因为碰巧在同一目录中的.py文件可能会隐藏您想要导入的命名相似的模块。
请注意,与main.py对等的.py文件不在包中。code3.py
不在submodules
包中,它也不能使用相对导入。
当您运行main.py
时,它可以
import submodules.moduleA.code1
但是它不能做任何相对的导入。有趣的是,main.py
可以导入自身
import main
并且会有main的第二个副本在运行,具有不同的名称空间。它的名字是__name__ == "main"
。
(*)这有点太强了。顶级脚本成为一个称为"__main__"
的模块。
https://stackoverflow.com/questions/63347514
复制相似问题