【问题标题】:Which is the correct way of handling imports in complex Python project?在复杂的 Python 项目中处理导入的正确方法是什么?
【发布时间】:2016-07-31 08:33:56
【问题描述】:

我一直将 Python 用于单文件脚本,现在我正在处理我的第一个“复杂”项目,因此我没有使用 Python (3.x) 中的包的经验。

我知道这是一个经常被问到的问题,但是我错过了在我的项目中成功组织模块导入的一些东西,应该将其用作库。

假设以下项目树:

myProject/
- subpackage1/
   - __init__.py
   - other1.py
- subpackage2/
   - __init__.py
   - other2.py
- __init__.py
- foo.py
- bar.py

从彼此导入模块的正确方法是什么?特别是:

  1. bar 导入foo
  2. other1 导入foo
  3. other2 导入other1
  4. 在开发过程中从不同的目录导入foo(这是一个库)(虚拟环境是正确的选择吗?)

谢谢!

编辑:(使问题更具体)我显然在询问之前尝试了不同的方法。我在一些流行的项目中看到的是使用像from myProject.subpackage1.other1 import something 这样的绝对导入。它看起来像一个干净的解决方案(类似于我过去在 Java 中所做的),但是当采用这种方法时,由于导入错误,我不能简单地运行我的代码。 virtualenv 可以作为在尝试导入软件包之前安装软件包的解决方案吗?

【问题讨论】:

    标签: python packages python-import


    【解决方案1】:

    1。从bar 导入foo

    正如the tutorial 所说,您可以通过导入from . 从同一目录导入模块。例如:

    from . import foo
    

    如果 barpython bar.py 一起执行,那么您也可以像任何其他模块一样绝对导入它:

    import foo
    

    这是有效的,因为已执行文件的父目录已添加到模块搜索路径 (sys.path/PYTHONPATH)。但是,我不会依赖这种行为,因为它对于导入的模块和主模块意味着不同的东西。

    2。从other1 导入foo

    如果您使用的是相对导入语法,那么您可以添加另一个 . 来表示父目录:

    from .. import foo
    

    3。从other2 导入other1

    现在这应该不足为奇,但是您也可以将相对导入与子包中的模块一起使用:

    from ..subpackage1 import other1
    

    4。在开发过程中从不同目录导入foo(库)

    我假设“不同的目录”是指“不同的项目”。在这种情况下,是的,您希望将 foo 打包为 distutils/setuptools 包,然后将其安装到另一个项目的 virtualenv 中。

    对于一个已经很长的帖子,具体如何做到这一点需要更多的参与,但 setuptools 网站有一个相当不错的tutorial 可以做到这一点。

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 2021-01-29
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2020-03-23
      • 2018-10-30
      相关资源
      最近更新 更多