软件包中的python导入模块

安迪奥

文件夹结构:

<current dir>
   main.py
   packages <dir>
      __init__.py
      mod.py

主要py:

import packages
print packages.mod.hello()

mod.py:

def hello():
    return 'hello'

__init__.py:

from packages import mod

如果我运行main.py,则不会出错。但是,如果我编辑__init__.py'from packages import *'则会出现此错误:AttributeError:'module'对象没有属性'mod'

我不是在问如何使该'print'命令起作用。我可以使用其他'import'语法main.py来使其工作。现在的问题是:我很好奇的是'from packages import mod'__init__.py如果我可以,import mod那么当我替换为时import *,这意味着导入所有内容,为什么我会收到错误消息?

from packages import *里面真正含义是__init__.py什么?

有人可以帮忙吗?谢谢

迈克·米勒

简短答案

from packages import *里面真正含义是__init__.py什么?

__init__.py进口本身。

解释

您只能导入模块,不能导入软件包。包只是模块或子包的容器。当您“导入”软件包时,您实际上是在导入模块__init__.py

__init__.py与此内容:

from packages import mod

将模块mod导入__init__.py因此,它将在您的过main.py孔中可用packages.mod(请记住packages由表示__init__.py)。

当您将的内容更改__init__.py为:

from packages import *

您正在导入模块__init__.py(与您所在的文件相同)。此方法有效(第二次导入只会触发in的查找sys.modules),但不会为您提供的内容mod

这意味着,您可以使用:

from module import *

但您不能明智地将其与空值一起使用__init__.py

from package import *

因为package实际上是由表示的__init__.py,所以目前还没有任何内容。您可以检查此内容(以交互方式或在文件中):

>>> import packages
>>> print(packages)
<module 'packages' from '/.../packages/__init__.py'>

__init__.py你可以这样写:

from packages.mod import *

然后在main.py

print packages.hello()

作品。因为该函数hello()现在位于文件的全局名称空间中__init__.py

如mozman的答案中所述,您可以使用__all__in__init__.py列出使用的模块(如果from packages import *使用的)。这是为此情况而设计的。

__init__.py只有这些内容:

__all__ = ['mod']

现在您可以在main.py

from packages import *

print mod.hello()

如果您扩展__init__.py

__all__ = ['mod']

from packages import *

您可以在main.py以下位置执行此操作

import packages

print packages.mod.hello()

但是,如果您from packages import *从中删除__init__.py

__all__ = ['mod'] 

您将得到一个错误:

AttributeError: 'module' object has no attribute 'mod'

因为__all__仅用于from packages import *案例。现在我们回到__init__.py进口本身。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

安装的Python脚本无法导入软件包模块

来自分类Dev

安装的Python脚本无法导入软件包模块

来自分类Dev

需要Python导入模块检查;由于不同的Python版本或Sublime Text导入软件包的方式?

来自分类Dev

如何从软件包中安装模块?

来自分类Dev

导入numpy和Scipy软件包的模块/子软件包的差异

来自分类Dev

导入模块的软件包与现有软件包相同

来自分类Dev

PyDev是从站点软件包中的软件包而不是开发软件包中导入的(绝对导入)

来自分类Dev

在pypi.org上找到导入特定软件包的Python软件包

来自分类Dev

在Atom中为Linter软件包安装软件包模块

来自分类Dev

如何在Python 3中导入上层软件包

来自分类Dev

为什么在Python中安装软件包和模块不一样?

来自分类Dev

防止Python软件包重新导出导入的名称

来自分类Dev

在开发python软件包期间如何正确导入?

来自分类Dev

无法在python中导入已安装的软件包

来自分类Dev

Python软件包未导入AWS EMR

来自分类Dev

无法在python中导入已安装的软件包

来自分类Dev

我希望Python首先检查要导入的软件包

来自分类Dev

在Ubuntu中导入lxml软件包python时出错

来自分类Dev

Python动态导入无法在Virtualenv中找到软件包

来自分类Dev

在开发python软件包期间如何正确导入?

来自分类Dev

Julia中已加载/已导入软件包的列表

来自分类Dev

从IDLE vs Shell中的软件包导入

来自分类Dev

导入已经在公共仓库中的本地软件包

来自分类Dev

这些软件包需要从(在NAMESPACE文件中)导入

来自分类Dev

Python模块/软件包名称的Sphinx apidoc部分标题

来自分类Dev

在Windows上使用IDLE安装python模块/软件包

来自分类Dev

Debian软件包如何从PyPI安装Python模块

来自分类Dev

Debian软件包如何从PyPI安装Python模块

来自分类Dev

使用Ansible pip模块安装python软件包的问题

Related 相关文章

  1. 1

    安装的Python脚本无法导入软件包模块

  2. 2

    安装的Python脚本无法导入软件包模块

  3. 3

    需要Python导入模块检查;由于不同的Python版本或Sublime Text导入软件包的方式?

  4. 4

    如何从软件包中安装模块?

  5. 5

    导入numpy和Scipy软件包的模块/子软件包的差异

  6. 6

    导入模块的软件包与现有软件包相同

  7. 7

    PyDev是从站点软件包中的软件包而不是开发软件包中导入的(绝对导入)

  8. 8

    在pypi.org上找到导入特定软件包的Python软件包

  9. 9

    在Atom中为Linter软件包安装软件包模块

  10. 10

    如何在Python 3中导入上层软件包

  11. 11

    为什么在Python中安装软件包和模块不一样?

  12. 12

    防止Python软件包重新导出导入的名称

  13. 13

    在开发python软件包期间如何正确导入?

  14. 14

    无法在python中导入已安装的软件包

  15. 15

    Python软件包未导入AWS EMR

  16. 16

    无法在python中导入已安装的软件包

  17. 17

    我希望Python首先检查要导入的软件包

  18. 18

    在Ubuntu中导入lxml软件包python时出错

  19. 19

    Python动态导入无法在Virtualenv中找到软件包

  20. 20

    在开发python软件包期间如何正确导入?

  21. 21

    Julia中已加载/已导入软件包的列表

  22. 22

    从IDLE vs Shell中的软件包导入

  23. 23

    导入已经在公共仓库中的本地软件包

  24. 24

    这些软件包需要从(在NAMESPACE文件中)导入

  25. 25

    Python模块/软件包名称的Sphinx apidoc部分标题

  26. 26

    在Windows上使用IDLE安装python模块/软件包

  27. 27

    Debian软件包如何从PyPI安装Python模块

  28. 28

    Debian软件包如何从PyPI安装Python模块

  29. 29

    使用Ansible pip模块安装python软件包的问题

热门标签

归档