【问题标题】:Python 3.4 importing a util class from another directoryPython 3.4 从另一个目录导入 util 类
【发布时间】:2024-04-13 11:40:01
【问题描述】:

我有一个如下的文件夹结构,我想将一个类从 Util1.py 导入到 Impl1.py,但不知道如何编写 Import 函数。我已经看到提到 PYTHONPATH,但无法完全弄清楚如何围绕它编写细节。任何帮助表示赞赏

根文件夹 |---实用工具 |---源 |--Util1.py |--Util2.py |---Impl1 |---源 |--Impl1.py |--Impl2.py

一些信息 - 我正在使用 Python3.4。请让我知道我可以提供哪些其他信息来帮助你们回答我的问题

【问题讨论】:

  • 您想将 Impl1 导入 Util1 吗?或相反亦然?。问题不清楚:)

标签: python import python-3.4 subdirectory


【解决方案1】:

处理此问题的正确方法是将项目构建成包,然后使用相对导入。 (这里有很多关于如何执行此操作的问题,例如:[1][2]

如果您无法重构代码,则可能需要使用kludge 方法,即动态地将包含“其他”代码的目录添加到您的 PATH。

例如,假设您在Impl1.py 内部,并且想要在Util1.py 内部调用foo 函数,您可以这样做:

# Get parent of parent
import os, sys
pp = os.path.realpath(__file__)
for _ in range(3): pp = os.path.dirname(pp)
# Add np to path
sys.path.append(os.path.join(pp, 'util', 'src'))

# Import file
import Util1

# Call function
Util1.foo()

【讨论】:

  • 当你说“pp = os.path.realpath(file)”时。 file 是 Util1.py 的完整路径,例如 /home//workspace/Root/Utils/src/Util1.py
  • 好的,那么你在 Util1.py 中试图去别的地方——将参数更新为join,并适当地更新importpp 被初始化为该路径,然后下一行向上 3 个目录(Src、Util、Root)
  • 谢谢你这样做:)
【解决方案2】:

您可以使用相对导入,例如

例如,要将 Util1.py 中的类 'foo' 导入 Impl1,您可以在 Impl1.py 中编写此代码

from ../../Util/Src/Util1 import foo

延伸阅读:https://*.com/a/12173406/2073920

【讨论】: