【问题标题】:how to organize a python module that scripts can be run as __main__ program?如何组织一个 python 模块,脚本可以作为 __main__ 程序运行?
【发布时间】:2012-08-29 07:22:09
【问题描述】:

我在python中开始一个项目,现在的代码结构如下:

project/
        __init__.py
        a.py
        b.py
        mainA.py
        utilities/
                   __init__.py
                   mainB.py
                   c.py

__init__ 文件都是空白的。

我想将utilities/mainB.py 作为程序运行(使用python main.py 之类的东西),而mainB 需要导入a.pyb.py。所以我尝试了from .. import a 和其他一些方法,但import 失败了。错误信息是:

ValueError: 尝试在非包中进行相对导入

那么问题来了:

  1. 如何修复mainB.py 使其可以作为主程序运行?
  2. mainA.py现在可以作为主程序运行,它还导入a.pyb.py(使用import aimport b)。 我认为代码结构可能会变得更加复杂。比如说,如果mainA.py 必须从project/some/directory 导入一个模块,我该怎么做?

【问题讨论】:

    标签: python import code-organization


    【解决方案1】:

    this previous question。你有两个选择。一种是使用__package__ 中描述的PEP 366 属性来设置模块的相对名称。另一种是将脚本作为模块执行(使用-m 标志给解释器)而不是直接作为脚本运行。

    【讨论】:

    • PEP 366 说 Additional code that manipulates sys.path would be needed in order for direct execution to work without the top level package already being importable. 能否根据我的代码结构告诉我如何操作?
    • 您确定您的顶级代码不可导入吗?如果您的顶级代码不可导入(例如,如果您不能执行 import project 并让它工作),那么将其作为一个包根本没有多大意义。
    【解决方案2】:

    您可以使用 Python 的内置模块运行功能 (python -m <module>)。

    python -m project.utilities.mainB
    

    这允许您将 mainB 作为包的一部分正常编写,因此相对和绝对导入都可以正常工作。

    有关此功能的深入讨论,请参阅PEP-338

    【讨论】:

      【解决方案3】:

      您应该在 PYTHON_PATH 中添加“项目”目录,然后在 mainB.py 中:

      from project import a
      

      【讨论】:

        猜你喜欢
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        • 2018-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多