【问题标题】:Python module imports of copied in third party library在第三方库中复制的 Python 模块导入
【发布时间】:2021-03-22 12:18:22
【问题描述】:

我知道 python 模块导入问题是本课程的标准问题,通常我对它的工作方式相当有能力,但是我所处的这种情况完全让我感到困惑。

我有一个类似这样结构的项目:

myproj
|- __init__.py
|- somefile.py

这很简单,并且在 TorchServe 中的 AWS SageMaker 上运行时运行良好(尽管这并不那么相关)。

现在我在一个库中复制到我的项目的根目录,这随后有子文件夹(模块)引用其中的其他人。

myproj
|- __init__.py
|- somefile.py
|- third_party_lib
    |- models
    |   |- A.py
    |- utils
        |- B.py

在我的主要somefile.py 中,我有一个类似的导入

from third_party_lib.models.A import XYZ

在文件 A 中有一个导入,例如

from utils.B import XYZ

这是事情失败的地方,有许多与此类似的内部导入无法解析。

第三方库没有 init.py 但是我尝试添加一个并没有解决问题。 我还尝试在 third_party_lib 文件夹中使用 sys.path.append() 来增加 PATH。

在这种情况下,由于third_party_lib 是我自己不维护的 git 子树,我宁愿尽可能不对其进行任何更改(否则将来在拉取上游更新时事情会变得一团糟),但是我如果需要,可以在其中放置一个 init.py,因为这很容易维护。

我现在有点不知所措,我希望这是对 Python 模块工作方式的简单混淆之一。

感谢您的帮助,如果您需要更多信息,请告诉我。

【问题讨论】:

  • from myproj.third_party_lib.models.A import XYZ 有效吗?我很惊讶在根目录中看到__init__.pymyproj 的父目录必须在 sys.path 上。
  • 根目录中的 init.py 只是我在最后一天试图让这个工作的一个冰雹玛丽,我最初没有那个。我刚刚尝试了您对from myproj.third_party_lib.model.A import XYZ 的建议,现在得到了ModuleNotFoundError: No module named 'myproj' 我开始怀疑这是否实际上是在 TorchServe 上运行并且文件夹名称可能正在更改等可能会使问题更加复杂。

标签: python python-module


【解决方案1】:

好吧,我很尴尬地承认,但这对我来说是一个愚蠢的错误。 万一有人对我遇到类似的问题,这是我增加系统路径的方式

from pathlib import Path
sys.path.insert(0, (Path(__file__).parent / 'some_folder').resolve())

很容易被忽略的问题是放入Path数组的item其实是一个Path对象!不是字符串,解决方案是将路径调用包装在 str() 中,例如

from pathlib import Path
sys.path.insert(0, str((Path(__file__).parent / 'some_folder').resolve()))

这样一个简单的事情可以忽略,尤其是当我什至每次都打印出 sys.path 但很容易错过数组中的项目实际上是用 PosixPath("xxxxxxxxxxx") 而不是原始 str 包装的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2016-12-28
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多