【问题标题】:Python 3 - Modules and Packages Mess - ArchitecturePython 3 - 模块和包混乱 - 架构
【发布时间】:2017-07-11 04:56:56
【问题描述】:

几个月前,你开始从事一个小项目,随着时间的推移变得越来越大。它从几个 python 文件开始:

project
│   program_1.py
│   program_2.py    

我们继续添加更多程序,所以为了避免代码重复,我开始将常用函数提取到单独的文件中。

project
│   program_1.py
│   program_2.py
│   program_3.py
│   shared_module_1.py
│   shared_module_2.py

我们不断添加更多程序,它们的大小相当大,所以我把它们放在自己的文件夹中,就像这样。还要避免在项目文件夹中放置更多文件(这只是一个简化的示例,文件夹有 15 个以上的文件):

project
│   program_1.py
│   program_2.py
│   program_3.py
│   shared_module_1.py
│   shared_module_2.py
└───program_4
    │   program_4.py
    │   program_4_aux.py

为了让 program_4.py 使用共享模块,我必须使用以下语句:

sys.path.append('../')

我无法跟上这样的步伐。代码变得混乱且难以维护。我不知道如何清理这个烂摊子。

PD:我尝试使用from .. import shared_module_1,但它告诉我parent module '' not loaded cannot perform relative import

非常感谢您的宝贵时间。

【问题讨论】:

  • 该项目是一套对公司有用的自动化工具。许多已经在使用中。我希望有一种方法可以在不破坏所有代码的情况下清理这个烂摊子。
  • 虽然我认为这是一个很好的问题,但目前它有点宽泛。也许您可以将其缩小到您认为可能是一个好的布局以及为什么它不起作用?
  • 我的想法是让这个大文件夹包含所有这些方便的脚本,并能够在它们之间重用一些逻辑。我想知道实现这一目标的最佳实践(遵循 python 原则)是什么。

标签: python python-3.x import architecture


【解决方案1】:

去看看django的布局方式。

注意事项:

  • 存储库的根目录不是主要的可导入 python 模块(即顶层没有 init.py 文件)。那是在子目录./django
  • 应该没有脚本,即可以在模块内运行的独立 python 文件。 manage_translations.py 脚本通过导入使用了一些 django 功能,但它存在于 ./scripts 中。此外,脚本应该从不使用相对导入(因为脚本不在模块中!)
  • 测试也不存在于主模块中。
  • 如果您认为需要修改 sys.path,您可能做错了。
  • django 包中的功能根据其功能进行逻辑拆分。例如。有一个子模块./django/db 用于处理与数据库相关的功能。如果做得好,那么通用子模块(如果有的话)可以很容易地完全移动到一个单独的项目中,如果这有帮助的话。

因此建议将所有模块代码移动到与程序代码分开的子目录中,例如:

project
    module
        __init__.py
        module_1.py
        module_2
            __init__.py
            submodule_a.py
    scripts
        program1.py

那么你只需要确保project 在你的 PYTHONPATH 中,你就可以做到例如

from module.module_1 import Module1Class

等等

【讨论】:

    【解决方案2】:

    最简单的解决方案是将程序所在的目录添加到 PYTHONPATH 环境变量中,如Permanently add a directory to PYTHONPATH

    另一种解决方案是从共享模块所在的目录调用程序:

    python program_4/program_4.py
    

    您也应该查看 init.py 文件,尽管这不是解决方案。

    第三种选择是将共享模块放在 python 库包中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多