【问题标题】:ImportError while trying to use custom package尝试使用自定义包时出现 ImportError
【发布时间】:2018-07-09 10:51:28
【问题描述】:

我尝试将一些脚本分组到一个包中,但我总是收到 ImportErrors。系统是 Ubuntu 16.04,在名为 tensorflow 的 Anaconda 环境中。我正在使用 python 3.6。

我的文件结构是这样的(项目文件夹在我用户的主目录下):

-- project_folder
---- src
     |-> test.py
     |-> package
         |-> A.py
         |-> B.py
         |-> __init__.py

__init__.py 导入 A.pyB.py

## __init__.py contents
import A
import B

A.py 中,我定义了一个打印字符串的简单测试函数:

## A.py contents
def test():
    print('import works')

当我处理我的测试脚本test.py 时,我得到了自动完成工具来向我展示测试功能。看起来是这样的

## test.py contents
import package

package.A.test()

但是在执行它时,尝试导入包时出现 ImportError:

ImportError: 没有名为“A”的模块

我做错了什么?我必须设置 PYTHONPATH 吗?我尝试了here 的一些解决方案,但都没有奏效。

谢谢!

【问题讨论】:

    标签: python python-import importerror


    【解决方案1】:

    您需要相对导入,否则解释器将在sys.path 的所有目录中搜索A,其中包含标准文件夹中的../src。这就是您收到导入错误的原因。

    ## __init__.py contents
    from . import A
    from . import B
    

    【讨论】:

    • 谢谢,我不知道相对导入的概念。肯定会赶上它。
    【解决方案2】:

    你可以试试这个(直接导入你的模块):

    ## test.py contents
    import package.A
    
    package.A.test()
    

    对我来说,这种方式更好,因为你知道你的模块来自哪里,你不需要修改__init__.py文件。

    或者您需要将您的模块包含到__all__ 变量中:

    ## __init__.py contents
    import A
    import B
    
    __all__ = ['A', 'B']
    

    【讨论】:

    • 不幸的是,这不起作用。这两个都不是。你能详细说明一下all的用法吗?
    猜你喜欢
    • 2021-06-26
    • 2013-12-14
    • 1970-01-01
    • 2011-05-12
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多