Python 将函数导入包级别

Python importing function to package level

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

我有一个 python 应用,其布局如下:

main.py
sources/
    __init__.py
    utils.py

我的 __init__.py 包含:

from sources.utils import show

其中 showutils

中定义的函数

我希望能够写成 main.py:

from sources import show
show()

但是我得到了一个错误 ImportError: cannot import name 'show'

任何帮助将不胜感激


编辑:

看来是我使用的PyCharm IDE引起的。直接从 linux 控制台在 python 中 运行 的相同代码就像魅力一样。

抱歉打扰了大家,谢谢大家的帮助。

此致, 最大

试试这个:

__init__.py

import utils
show = utils.show

main.py

from sources import show
show()

如评论中所见....

__init__.py改为

from utils import show

引用official recommendations:

Python 2.x, imports are implicitly relative. For instance, if you're editing the file foo/__init__.py and want to import the module at foo/bar.py, you could use import bar.

In Python 3.0, this won't work, as all imports will be absolute by default. You should instead use from foo import bar; if you want to import a specific function or variable from bar, you can use relative imports, such as 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