【问题标题】:How to import modules from parent directory/different package?如何从父目录/不同包导入模块?
【发布时间】:2021-03-09 17:28:10
【问题描述】:

在处理我从 GitHub 克隆的项目时,我遇到了一个问题,即无法识别出关于 目录或 不同包 中的模块的 import 语句ImportError。我发布了this关于我的特定场合的问题并继续研究它。

最后,我得出了一个结论,我想与一些资源一起分享未来类似的问题。


问题

  • 如何import来自目录或不同包的模块?
  • 正确的方法是什么?

【问题讨论】:

  • Python 可与已安装 模块和包一起使用。当你安装一个包时,它的脚本进入系统PATH 上的一个目录来执行,它的包和模块进入python维护的模块路径之一。如果您想访问从 github 克隆的其他包,...,请不要。相反,安装该包,现在它只是一个导入。

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


【解决方案1】:

回答

(或只是有关问题的一些信息)

根据python docs,导入模块的工作方式如下:

当导入名为 spam 的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它会在变量 sys.path 给出的目录列表中搜索名为 spam.py 的文件。 sys.path 从这些位置初始化:

  • 包含输入脚本的目录(或未指定文件时的当前目录)。
  • PYTHONPATH(目录名称列表,与 shell 变量 PATH 语法相同)。
  • 依赖于安装的默认值。

所以,如果您只是想import 一个模块,例如my_pkg.my_module.py,它与模块导入位于不同位置,my_pkg 应该在列表中 sys.path 回报。为此,有(据我所知)三种方式:

  1. 修改PYTHONPATH变量。 (正如 here 指出的那样)- 不是首选
  2. 运行时修改sys.path。 (正如here 指出的那样)- 不是首选
  3. 拥有一个setup.py 文件来解决模块的导入依赖关系(还可以做许多其他重要的事情)- 正确的方式

因此,上述前两种方法通常被认为不是是一种良好做法,而是一种临时 - 不好的解决方案,它将在开发过程中导致进一步的问题。然而,第三种方法是构建可分发组织良好项目的最佳方法,该项目将很容易被其他人使用。 setup.py 文件的一些好处在here 以及它的全部功能中进行了说明。

使用setup.py 文件,您可以清楚地配置 哪些是包含要导入 的模块的包,以解决ImportError 并做许多其他有用的事情你的项目。

下面引用了两个非常说明性的教程,关于如何使用 import 语句和如何创建 setup.py 文件,我 强烈推荐看看:


编辑:此外,您可以在此处找到有关如何配置、打包和分发您的项目的大量信息:

就我个人而言,我发现它对于构建一个相当不错的第一个setup.py 文件非常有用。

【讨论】:

    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多