【问题标题】:Python module importingPython 模块导入
【发布时间】:2014-08-06 19:05:42
【问题描述】:

我正在开发一个 GUI 应用程序。假设我在根目录中有一个文件main.py,我想导入这样的小部件:

from widgets import FancyWindow, ColorPicker
# ...

我的应用程序结构如下:

| main.py
+ widgets/
    | __init__.py
    | fancy_window.py
    | color_picker.py
...

IIRC,我必须像这样从其他模块导入类:

from widgets.color_picker import ColorPicker
from widgets.fancy_window import FancyWindow

所以我的问题是我是否可以在 widgets/__init__.py 中做些什么来实现它,以便我可以按照我想要的方式进行导入?

【问题讨论】:

  • widgets/__init__.py 中导入您希望在widget 包的命名空间中可用的东西。即from fancy_window import FancyWindow.

标签: python import module init


【解决方案1】:

你实际上已经有了它,只需让你的 __init__.py 有这两行:

from widgets.color_picker import ColorPicker
from widgets.fancy_window import FancyWindow

您在__init__.py 中导入的任何内容(以及您定义的任何其他符号)都将可用。

例如如果你输入:

apple = 5

__init__.py 你也可以这样做:from widgets import apple。没有魔法:)

【讨论】:

  • 这对我有用。但是还有一点奇怪的问题。如果我尝试在main.py 中执行from widgets import *,我会收到来自importlib 的错误,告诉我TypeError: hasattr(): attribute name must be string。但是如果我不打星并给出我想要的小部件的实际名称,就没有错误。
  • @Benjamin 您需要为那个发布更多代码/上下文 - 也许会打开一个不同的问题?
【解决方案2】:

__init__.py 你可以导入模块,然后导出它们:

from fancy_window import FancyWindow
from color_picker import ColorPicker

__all__ = [FancyWindow, ColorPicker]

现在,您可以执行以下操作:

from widgets import * # Only imports FancyWindow and ColorPicker
from widgets import FancyWindow
from widgets import ColorPicker
import widgets
color_picker = widgets.ColorPicker()

【讨论】:

    【解决方案3】:

    最好的方法是使用__init__.py 来执行软件包所需的设置。

    # __init__.py
    from fancy_window import FancyWindow
    from color_picker import ColorPicker
    

    那么在main.py你就可以直接进行导入了。

    # main.py
    from widgets import FancyWindow, ColorPicker
    

    更方便的方式将所有内容打包在__init__.py

    # __init__.py
    from fancy_window import *
    from color_picker import *
    

    【讨论】:

      【解决方案4】:

      是的,通过将其他模块的公共变量添加到 __init__.py 中的 __all__
      https://docs.python.org/3/reference/simple_stmts.html#import

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-06
        • 2016-12-15
        • 1970-01-01
        • 2023-04-05
        • 2018-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多