【问题标题】:python can't use function in submodulepython不能在子模块中使用函数
【发布时间】:2015-08-12 20:03:34
【问题描述】:

我的文件夹结构是这样的:

pythonstuff/
    program.py
    moduleA/
        __init__.py
        foo.py
        bar.py

这是我的bar.py 代码:

def hello():
    print("Hello, world!")

这是我的program.py 代码:

#!/usr/bin/env python3
from moduleA import bar
bar.hello()

我跑$ python3 program.py

不知怎的,我得到了一个错误:

File "program.py", line 3, in <module>
bar.hello()
AttributeError: 'module' object has no attribute 'hello'

编辑:我的__init__.py 文件为空。

Edit2:在尝试了一切之后,我终于意识到我在根目录中有一个bar.py,它实际上包含hello() 方法。 moduleA/ 目录中的bar.py 为空。

【问题讨论】:

  • 您的 init 文件中有什么内容?
  • 初始化文件为空
  • 它在 Linux 上的 Python 3.4.0(默认,2014 年 4 月 11 日,13:05:11)[GCC 4.8.2] 下按照我的预期运行。检查你的 PYTHONPATH???
  • 你有旧的 bar.pyc 文件吗?
  • 哎呀,我在根目录中有一个 bar.py,其中包含最初发布在我的问题中的代码。我的 moduleA 目录中的 bar.py 是一个空白文件。将文件从根目录移动到 moduleA 目录解决了这个问题。我应该删除这个问题还是...?

标签: python methods module


【解决方案1】:

把这个加进去

import os

__all__ = []

for module in os.listdir(os.path.dirname(__file__)):
    if module != '__init__.py' and module[-3:] == '.py':
        __all__.append(module[:-3])

init.py 文件是让 Python 处理 包含包的目录;这样做是为了防止 无意中使用通用名称(例如字符串)的目录 隐藏稍后出现在模块搜索路径上的有效模块。在 最简单的情况,init.py 可以只是一个空文件,但它可以 还执行包的初始化代码或设置 all 变量,稍后介绍。

来自documentation

因此,使用该代码,您可以将 moduleA 中的模块显式添加到 all 变量中。 This explains the all variable

【讨论】:

  • __all__ 用于通配符导入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 2021-03-07
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多