【问题标题】:Importing a function from a module fails, but classes can be imported从模块导入函数失败,但可以导入类
【发布时间】:2017-09-22 05:44:22
【问题描述】:

我有一个包含多个嵌套模块的包:

somepackage/
  module1/
    __init__.py
    module2/
      __init__.py
      to_be_imported.py
setup.py

我已经用python setup.py develop 安装了这个包。 to_be_imported.py 文件包含一些类和一个方法(在类之后,因为该方法使用了类的一些类方法)。打开 IPython 控制台后,以下导入工作:

from somepackage.module1.module2.to_be_imported import SomeClass

但是这个失败并出现 ImportError:

from somepackage.module1.module2.to_be_imported import my_method

此外,如果我将文件导入为

from somepackage.module1.module2 import to_be_imported

并打印导入的文件内容,也打印my_method

我对导致导入错误的原因感到困惑,有人遇到过这样的问题吗?

【问题讨论】:

  • 你确定你在module2/__init__.py 中导入了to_be_imported 和:from .somepackage.module1.module2.to_be_imported import *
  • 对不起,我的问题有错别字,忘记在前两个导入中添加 .to_be_imported,我的 init.py 文件是空的

标签: python python-3.x


【解决方案1】:

请注意,module2 是一个用词不当,因为它实际上不是一个模块,而是一个子包。

您可以访问SomeClass,因为它已从to_be_imported 导入到module2.__init__.py。您可以打开module2.__init__.py 进行确认。

要访问该函数,您应该指定完整路径:

from somepackage.module1.module2.to_be_imported import my_method

或者将其导入module2.__init__.py 以使用较短的路径。

【讨论】:

  • 请看我更新的问题,我确实使用了完整路径,我的问题不正确。
【解决方案2】:

事实证明,我的问题是我的模块被缓存到我的 IPython 会话中。我后来添加了my_method,所以缓存版本没有包含它,但是当我打印文件时,它打印了最新版本。有关该主题的更多信息: Prevent Python from caching the imported modules

总结一下:我只需要重启控制台。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 2015-10-27
    • 2016-11-12
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多