【问题标题】:Python - Doing absolute imports from a subfolderPython - 从子文件夹进行绝对导入
【发布时间】:2010-10-02 14:16:27
【问题描述】:

基本上我问的问题和这个人一样:How to do relative imports in Python?

但是没有人给他一个正确的答案。鉴于您在一个子文件夹中,并且您想进入一个目录,然后进入另一个子文件夹,按照他们的建议去做是行不通的(正如 OP 在他的 cmets 中指出的那样)。

我知道您可以使用 sys.path 来做到这一点,但我更喜欢更简洁的方法。

例子:

App
__init__.py
Package_A
--__init__.py
--Module_A.py
Package_B
--__init__.py
--Module_B.py

如何将 Module_A 导入 Module_B?

【问题讨论】:

  • “Module_A”是指“Package_A”吗?一个包包含一个“init.py,可能还有其他模块。你能否将你的“Module_A”和“Module_B”重写为“Package_A”和“Package_B”所以你的问题是更清楚?

标签: python python-import


【解决方案1】:
main.py
setup.py
app/ ->
    __init__.py
    package_a/ ->
       __init__.py
       module_a.py
    package_b/ ->
       __init__.py
       module_b.py
  1. 你运行python main.py
  2. main.py 确实:import app.package_a.module_a
  3. module_a.pyimport app.package_b.module_b

或者 2 或 3 可以使用:from app.package_a import module_a

只要你的 PYTHONPATH 中有 app,它就可以工作。 main.py 可以在任何地方。

所以你写一个setup.py来复制(安装)整个应用程序包和子包到目标系统的python文件夹,main.py到目标系统的脚本文件夹。

【讨论】:

  • 主要是将适当的__init__.py 文件添加到每个目录,并在导入语句中包含app。如果您这样做,将import app.package_a.module_a 行添加到module_b.py 应该进行适当的导入。基本上,第 3 步就是你想要的,其余的都是无关紧要的,除非你打算分发包。
【解决方案2】:

如果我是reading correctly,在 Python 2.5 或更高版本中:

from ..Module_B import Module_B

我以为我精通 Python,但我不知道在 2.5 版本中可以做到这一点。

【讨论】:

  • 没错。不过这有点难看,绝对导入通常是最好的,除非在特殊情况下。
  • 这不起作用我得到“尝试在非包中相对导入”
  • 该语句假定在 Module_A.py 内部(并且,编辑后,应该来自 ..Package_B。)相对导入基于您所在模块的包路径,而不是目录;您不能从顶级脚本或简单模块中使用它们。
【解决方案3】:

如果您随后将 Module_B 导入 App,您会

模块_B.py: 导入模块A

App.py(它还导入了现在默认位于 Pythonpath 中的 ModuleA)

import Module_B.Module_B

另一种选择是将 __init__.py(Module_A/App 文件夹中的那个)更新为:

import os
import sys
sys.path.extend('%s../' % os.getcwd())
import ModuleA

另一种选择是将您的文件夹添加到 PYTHONPATH 环境变量中。

【讨论】:

  • 在运行时修改sys.path 几乎总是错误的。它很脆弱,表明包装结构不良。
猜你喜欢
  • 2021-06-02
  • 2013-02-19
  • 2013-07-12
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 2020-01-24
  • 2012-12-13
相关资源
最近更新 更多