【问题标题】:Organizing packages that provide functionality to each other and to the main program组织为彼此和主程序提供功能的包
【发布时间】:2013-07-16 16:08:05
【问题描述】:

我在 Python 程序上有以下结构:

my_program/
    main.py
    packages/
        __init.py__
        package_to_share/
           __init__.py
            main_to_share.py
            module_to_share.py
        package_A/
           __init__.py
            main_A.py
            some_module_A.py
        package_B/
           __init__.py
            main_B.py
            some_module_B.py

package_to_share 提供packages 文件夹中的每个包都使用的功能,以及根文件夹中的main.py 使用的功能。

我还希望能够cd 进入每个包并能够运行main_X.py

到目前为止,我想出了如何从main.py访问功能:

import packages.package_A.some_module_A
import packages.package_to_share.module_to_share

但我在从常规包(例如 package_A)访问 package_to_share 中的功能时遇到问题

例如,在main_A.pysome_module_A.py 中,输入import packages.package_to_share.module_to_share 失败。

这导致我提出以下问题:

  1. 鉴于我的问题的具体情况,包将由根文件夹中的文件和其他包共享(访问),有没有更好的方法来组织我的文件夹?这种模块和文件的组织通常是否符合 Python 中的良好标准?

  2. 以下内容对我来说看起来非常糟糕,但这是我想出的最好的办法,以确保我的常规模块可以看到 "shared" 模块:

    p_this_file   = os.path.dirname(os.path.realpath(__file__))
    new_sys_path.append(os.path.join(p_cwd, '..')
    new_sys_path.extend(sys.path)
    sys.path      = new_sys_path
    

    它也不会阻止我的常规包相互导入。

【问题讨论】:

  • 我已经完全有这种困惑已经有一段时间了。我在任何地方都找不到“正确完成惯用的 Python 代码库设计”的指南。

标签: python


【解决方案1】:

您可以在module_A 中使用相对导入,而不是操纵导入路径(我不推荐):

from .. import shared

这就是我有时会做的事情,虽然我通常会安装我的包,以便我可以在需要使用它们的地方完全引用它们:

from my_module import shared

【讨论】:

  • 当您开发一个包含多个内部相互依赖的组件的代码库时,它还没有“安装”。
  • 确实如此,因此相对导入是支持这一点的一种方式。就个人而言,如果在生产中不是问题,我有时会发现经常在本地安装以进行开发是值得的。
  • 这可能是您回答的另一种选择。如果运行一个顶级setup.py 来安装整个代码库,每次你想运行一些东西是要走的路,我认为这可能是最有吸引力的选择(无论如何对我个人而言)。
猜你喜欢
  • 2023-03-18
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多