Python 3:从***包导入模块

Posted

技术标签:

【中文标题】Python 3:从***包导入模块【英文标题】:Python 3 : import module from top level package 【发布时间】:2021-02-05 10:42:57 【问题描述】:

我有一个简单的包结构,其中包含一个名为 ui 的模块:

test/
├── app.py
├── __init__.py
└── ui
    ├── __init__.py
    └── window.py

1 directory, 4 files

window.py 文件包含一个基本类:

# test/ui/window.py

class Window():
    def __init__(self):
        print("Window constructor")

在我的app.py 我有:

# test/app.py

from ui import window

def run():
    w = window.Window()

现在在 Python 3 shell 中,我应该可以从包 test 中导入模块 app,像这样调用 run 函数(我在包的父目录中):

>>> import test.app
>>> test.app.run()

但是我得到了这个错误(使用 Python3):

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test/app.py", line 1, in <module>
    from ui import window
ModuleNotFoundError: No module named 'ui'

请注意,这适用于 Python2.7...

这里有什么问题?

【问题讨论】:

【参考方案1】:

在 python 3.8 中测试

# test/app.py

from .ui import window


def run():
    w = window.Window()
>>> import test.app
>>> test.app.run()
Window constructor

你必须制作一个 .在 ui 前面说您正在使用本地文件夹。 由于我一般对 python 2 了解不多,我无法向你解释它为什么在那里工作,但我最好的猜测是,他们改变了如何在 python 3 中进行相对导入

【讨论】:

谢谢,它适用于 python 2.7 和 python 3.8 实际上具有相对导入。

以上是关于Python 3:从***包导入模块的主要内容,如果未能解决你的问题,请参考以下文章

python中模块包无法导入import问题

Python 3模块从另一个文件夹导入错误[重复]

Python_模块定义与导入

Python_包模块类导入

Python模块导入详解

python导入模块的方法都有哪些