如何从父 directory/different 包中导入模块?
How to import modules from parent directory/different package?
在我从 GitHub 克隆的项目中工作时,我遇到了 import
关于 parent 目录或 [=24] 中模块的语句的问题=]不同的包 无法识别抛出 ImportError
。我发布了 this 关于我的特定场合的问题并继续研究它。
最后,我得出了一个结论,我想与一些类似的未来问题的资源一起分享。
问题
- 如何
import
来自 父目录 或来自 不同包 的模块?
- 正确的方法是什么?
回答
(或者只是关于问题的一些信息)
根据 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。为此,有 (据我所知) 三种方式:
- 修改
PYTHONPATH
变量。 (如指出here)- 不首选
- 在运行时修改
sys.path
。 (如指出here)- 不首选
- 有一个
setup.py
文件来解析模块的导入依赖关系 (并且还做了许多其他重要的事情)。 - 正确方式
因此,上面的前两种方式通常被认为不是 好的做法,而是临时 - 糟糕的 解决方案,将在开发过程中导致更多问题。不过,第三个是 最好 构建 可分发 、 组织良好 项目的方法会很容易被其他人使用。 setup.py
文件的一些优点以及它的全部功能都在 here 中得到了说明。
使用 setup.py
文件你可以清楚地 configure 哪些包包含要 imported 解决的模块ImportError
并为您的项目做许多其他有用的事情。
下面引用了两个非常说明性的教程,关于如何使用导入语句和如何创建一个setup.py
文件,我强烈推荐看一看:
- https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html
- https://www.pythonforthelab.com/blog/how-create-setup-file-your-project/
编辑:此外,您可以在此处找到有关如何配置、打包和分发项目的大量信息:
就个人而言,我发现它对于构建一个相当不错的第一个 setup.py
文件非常有用。
在我从 GitHub 克隆的项目中工作时,我遇到了 import
关于 parent 目录或 [=24] 中模块的语句的问题=]不同的包 无法识别抛出 ImportError
。我发布了 this 关于我的特定场合的问题并继续研究它。
最后,我得出了一个结论,我想与一些类似的未来问题的资源一起分享。
问题
- 如何
import
来自 父目录 或来自 不同包 的模块? - 正确的方法是什么?
回答
(或者只是关于问题的一些信息)
根据 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。为此,有 (据我所知) 三种方式:
- 修改
PYTHONPATH
变量。 (如指出here)- 不首选 - 在运行时修改
sys.path
。 (如指出here)- 不首选 - 有一个
setup.py
文件来解析模块的导入依赖关系 (并且还做了许多其他重要的事情)。 - 正确方式
因此,上面的前两种方式通常被认为不是 好的做法,而是临时 - 糟糕的 解决方案,将在开发过程中导致更多问题。不过,第三个是 最好 构建 可分发 、 组织良好 项目的方法会很容易被其他人使用。 setup.py
文件的一些优点以及它的全部功能都在 here 中得到了说明。
使用 setup.py
文件你可以清楚地 configure 哪些包包含要 imported 解决的模块ImportError
并为您的项目做许多其他有用的事情。
下面引用了两个非常说明性的教程,关于如何使用导入语句和如何创建一个setup.py
文件,我强烈推荐看一看:
- https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html
- https://www.pythonforthelab.com/blog/how-create-setup-file-your-project/
编辑:此外,您可以在此处找到有关如何配置、打包和分发项目的大量信息:
就个人而言,我发现它对于构建一个相当不错的第一个 setup.py
文件非常有用。