Python 3 - 模块和包Mess - Architecture

时间:2017-02-21 14:05:42

标签: python python-3.x import architecture

几个月前,你开始从事一个随着时间的推移变大的小项目。它从一些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

非常感谢你的时间。

2 个答案:

答案 0 :(得分: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

然后你只需要确保你的PYTHONPATH中有project,你就能做到这一点。

from module.module_1 import Module1Class

答案 1 :(得分:-1)

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

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

python program_4/program_4.py

你应该看看 init .py文件,尽管不是解决方案。

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