我已经在这里找到了几个不同的答案和相关问题,但我仍然无法弄清楚我做错了什么。
我有一个布局如下的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