【问题标题】:Absolute and Relative Imports - Importing module in subfolder2 from subfolder1绝对和相对导入 - 从子文件夹 1 导入子文件夹 2 中的模块
【发布时间】:2021-06-02 00:45:20
【问题描述】:

项目结构

我的项目结构如下:

pythonProject\
    modules\
        __init__.py
        module1\
            __init__.py
            script1.py
        module2\
            __init__.py
            script2.py

script2.py的内容是:

def script2_function():
  return "Import worked successfully"

绝对导入

尝试绝对导入时,script1.py 的内容为:

from modules.module2.script2 import script2_function

print(script2_function())

运行 script1.py 时(来自项目根目录和 module1 目录)我收到以下错误:

ModuleNotFoundError: No module named 'modules'


相对导入

尝试绝对导入时,script1.py 的内容为:

from ..module2.script2 import script2_function

print(script2_function())

运行 script1.py 时(来自项目根目录和 module1 目录)我收到以下错误:

ImportError:尝试使用没有已知父包的相对导入


老实说,我无法理解我做错了什么,并尝试遵循几个指南和堆栈答案,但没有解决这个问题。 你能解释一下如何解决它,以便我更好地理解相对和绝对 python 导入吗?

提前感谢您提供的任何帮助。

【问题讨论】:

  • 主脚本(程序启动的地方)应该在“最高”的地方(直接在“pythonProject”中)。然后可以导入它下面和同一目录中的模块(也可以按所示方式相互导入)。
  • @MichaelButscher 有没有其他方法可以直接运行script1.py,项目根目录下没有“主脚本”?

标签: python python-3.x python-import


【解决方案1】:

如果我对您的理解正确,您可以将目录更改为pythonProject 目录并运行python3 -m modules.module1.script1import 语句与您运行 Python 的位置相关。

当然,另一种选择是在项目根目录中添加script1.py,这与上述类似,对于许多项目可能更有意义。

对于上述两种情况,script1.py 中的 import 语句可以是 from modules.module2.script2 import script2_functionfrom ..module2.script2 import script2_function

如果我误解了这个问题,我们深表歉意。

【讨论】:

  • 非常感谢马特。这确实是绝对进口的问题!你知道如何让它与相对导入一起工作吗?
  • 我刚刚检查过,第一段中的解决方案也适用于相对导入(我不倾向于在自己的工作中使用相对导入,所以不确定,但现在我知道了东西!):) 我会编辑我的答案。
猜你喜欢
  • 2012-12-13
  • 2013-01-18
  • 2012-02-15
  • 2010-10-02
  • 2017-06-07
  • 2013-07-12
  • 1970-01-01
  • 2013-02-19
相关资源
最近更新 更多