Python 将函数导入包级别



我已经在这里找到了几个不同的答案和相关问题,但我仍然无法弄清楚我做错了什么。

我有一个布局如下的python应用程序:

main.py
sources/
    __init__.py
    utils.py

我的__init__.py包含:

from sources.utils import show

其中 show 是在 utils 中定义的函数

我希望能够用 main.py 写:

from sources import show
show()

但相反,我收到一个错误ImportError: cannot import name 'show'

任何帮助将不胜感激


编辑:

似乎问题是由我正在使用的PyCharm IDE引起的。直接从linux控制台在python中运行的相同代码就像charm一样。

很抱歉打扰你们,谢谢你们的帮助。

此致敬意麦克斯

引用官方建议:

Python 2.x,导入是隐式相对的。例如,如果您正在编辑文件foo/__init__.py并希望在 foo/bar.py 导入模块,则可以使用 import bar .

在 Python 3.0 中,这是行不通的,因为默认情况下所有导入都是绝对的。您应该改用from foo import bar;如果要从 bar 导入特定的函数或变量,可以使用相对导入,例如 from .bar import myfunction

要么在__init__.py中使用绝对导入(from sources.util import show),要么使用显式相对导入(from .util import show)。

给定此设置:

sh$ cat sources/utils.py 
def show():
    print("show")
sh$ cat sources/__init__.py 
from sources.utils import show
# could be
# from .utils import show
sh$ cat main.py 
from sources import show
show()

它将在Python 2和3中按预期工作:

sh$ python2 main.py 
show
sh$ python3 main.py 
show

试试这个:

__init__.py

import utils
show = utils.show

main.py

from sources import show
show()

如评论所示....

__init__.py更改为

from utils import show

最新更新