Python导入函数到包级别

时间:2015-01-28 21:45:54

标签: python import module package

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

我有一个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一样。

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

最诚挚的问候, 最大

3 个答案:

答案 0 :(得分:2)

引用official recommendations

  

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

     

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

使用__init__.pyfrom 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

答案 1 :(得分:0)

试试这个:

__init__.py

import utils
show = utils.show

main.py

from sources import show
show()

答案 2 :(得分:0)

如评论所示......

__init__.py更改为

from utils import show