如何从父 directory/different 包中导入模块?

How to import modules from parent directory/different package?

在我从 GitHub 克隆的项目中工作时,我遇到了 import 关于 parent 目录或 [=24] 中模块的语句的问题=]不同的包 无法识别抛出 ImportError。我发布了 this 关于我的特定场合的问题并继续研究它。

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


问题

回答

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

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

When a module named spam is imported, the interpreter first searches for a built-in module with that name. If not found, it then searches for a file named spam.py in a list of directories given by the variable sys.path. sys.path is initialized from these locations:

  • The directory containing the input script (or the current directory when no file is specified).
  • PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH).
  • The installation-dependent default.

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

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

因此,上面的前两种方式通常被认为不是 好的做法,而是临时 - 糟糕的 解决方案,将在开发过程中导致更多问题。不过,第三个是 最好 构建 可分发 组织良好 项目的方法会很容易被其他人使用。 setup.py 文件的一些优点以及它的全部功能都在 here 中得到了说明。

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

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


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

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