【问题标题】:Given my file structure, what commands should I use to import the following modules?鉴于我的文件结构,我应该使用哪些命令来导入以下模块?
【发布时间】:2020-11-30 11:45:29
【问题描述】:

我一直在努力导入我用 python 编写的模块,使用设置为我的顶级 python 脚本目录的 Spyder IDE。以下是我的文件结构,基于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)

鉴于我的文件结构,我使用什么命令来相对导入我的模块?

【问题讨论】:

  • 相对导入需要安装包;你需要一个 setup.py,也许还有一个 __init__.py。例如这里:stackoverflow.com/questions/44977227/…
  • 你用的是什么 Python 版本?
  • 现在python 3.7.7
  • 这里不需要使用相对导入。只需from submodules.moduleA import code1import code3。 Python2 略有不同(你需要__init__.py 文件在这里和那里),但使用 Python3 你很好
  • 我是否误解了“相对进口”是什么?什么情况下你必须使用相对导入?

标签: python


【解决方案1】:

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__" 的模块。

【讨论】:

  • 我不太完全理解你的(第 1 段),感觉很像带有 PATH 和 LIB 的杂草,就像我实际上不需要完全理解的东西,以及你的(第 3 段)等等)。当您说“与 main.py 对等”时,您指的是与 main.py 位于同一目录中的任何 python 文件吗?
  • 你能补充一下什么时候应该使用“相对导入”吗?为什么 main.py 不能做任何相对导入?
  • 相对导入仅在包中有效,main.py 不在包中。通常,包是 python 路径中某处的目录。在您的示例中,submodules 成为一个包,因为它是您作为脚本运行的 main.py 的对等目录。它通常不适用于其他目录中的其他脚本。由于moduleAmoduleB 是子包,因此它们之间可以进行相对导入。code3.py 不在包中,因此不能用于相对导入。
  • 啊,这完全有道理。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 2019-05-14
  • 2012-03-14
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
相关资源
最近更新 更多