【问题标题】:Python importing function to package levelPython 将函数导入包级别
【发布时间】:2015-01-28 21:45:53
【问题描述】:

我已经在这里找到了几个不同的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改成from utils import show
  • @reptilicus 你不是说from .utils(使用. 相对导入语法)吗?
  • 感谢您的快速回复,但变化不大。现在 PyCharm IDE 抱怨未解决对“utils”的引用,并且错误仍然存​​在。
  • @MaxPasek 你能提供完整的 Traceback 吗?
  • 追溯应该在这里,但我已经找到了答案。再次感谢:)

标签: python import module package


【解决方案1】:

引用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__.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

【讨论】:

    【解决方案2】:

    试试这个:

    __init__.py

    import utils
    show = utils.show
    

    main.py

    from sources import show
    show()
    

    【讨论】:

      【解决方案3】:

      如 cmets 中所见....

      __init__.py改为

      from utils import show
      

      【讨论】:

        猜你喜欢
        • 2018-07-29
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 2018-01-13
        • 2018-06-05
        • 1970-01-01
        相关资源
        最近更新 更多