问题描述
文件夹结构:
<current dir>
main.py
packages <dir>
__init__.py
mod.py
main py:
import packages
print packages.mod.hello()
mod.py:
def hello():
return 'hello'
__init __。py:
from packages import mod
如果我运行 main.py
,我没有收到任何错误。但是如果我从包import *'编辑 __ init __。py
到',我会收到此错误: AttributeError :'module'对象没有属性'mod'
If I run main.py
, I get no error. But if I edit __init__.py
to 'from packages import *'
, I get this error: AttributeError: 'module' object has no attribute 'mod'
我不是在问这个'print'
命令工作。我可以在 main.py
中使用其他'import'
语法来使其正常工作。问题是:我对 __ init __。py
中的包导入mod'中的'感到好奇。如果我可以
导入mod
然后当我替换为 import *
,这意味着导入所有东西,为什么我得到一个而不是错误?
I'm not asking how to make that 'print'
command work. I can use other 'import'
syntax in main.py
to make it work. The question is: I'm curious about that 'from packages import mod'
in the __init__.py
. If i can do import mod
then when I replace to import *
, which means import everything, why do I get an error instead?
那么来自包导入* 的在
__ init__中真正意味着什么? .py
?
任何人都可以提供帮助吗?谢谢
Anyone can help? Thanks
推荐答案
简短回答
那么包裹导入的 *
真正意味着在 __ init __。py
?
Short answer
So what does the from packages import *
really mean inside that __init__.py
?
__ init __。py
自行导入。
您只能导入模块,而不能导入包。包只是模块或子包的容器。当你导入一个包时,你实际上导入了模块 __ init __。py
。
You can only import modules, not packages. Packages are just containers for modules or sub-packages. When you "import" a package you actually import the module __init__.py
.
__ init __。py
使用此内容:
from packages import mod
将模块 mod
导入 __ init __。py
。因此,您的 main.py
将通过 packages.mod
提供
(请记住 packages
由 __ init __。py
)表示。
imports the module mod
into __init__.py
. Therefore, it will be availablein your main.py
via packages.mod
(remember packages
is represented by __init__.py
).
当你改变时来自包裹进口的$ code> __ init __。py 的内容:
When you change the content of __init__.py
to:
from packages import *
您正在导入模块 __ init __。py
,你在同一个文件。
这个工作(第二个导入只是触发 sys.modules
中的查找)
但不会给你 mod
的内容。
You are importing the module __init__.py
, the very same file you are in.This works (a second import just triggers a lookup in sys.modules
)but won't give you the content of mod
.
这意味着,您可以使用:
This means, you can use:
from module import *
但你不能合理地使用空白 __ init __。py :
from package import *
因为包
实际上由 __ init __。py
表示,并且
还没有。你可以检查这个(交互式或文件中):
Because package
is actually represented by the __init__.py
and thereis nothing in it yet. You can check this (interactively or in file):
>>> import packages
>>> print(packages)
<module 'packages' from '/.../packages/__init__.py'>
在 __ init __。py
中你可以写:
from packages.mod import *
然后在 main.py
:
print packages.hello()
有效。因为函数 hello()
现在位于
文件的全局名称空间 __ init __。py
。
works. Because the function hello()
is now in the global name space of thefile __init__.py
.
正如mozman的回答中所提到的,你可以在 __ init__.py中使用
到 __ all __
列出中的,则应导入nofollow>。这是为这种情况设计的。
As mentioned in the answer by mozman, you can use __all__
in __init__.py
tolist the modules that should be imported if from packages import *
is used. This is designed for this case.
__ init __。py
只有这个内容:
__all__ = ['mod']
现在你可以在 main.py
中执行此操作:
Now you can do this in main.py
:
from packages import *
print mod.hello()
如果你扩展你的 __ init __。py
:
__all__ = ['mod']
from packages import *
您可以在<$ c $中执行此操作c> main.py :
import packages
print packages.mod.hello()
但如果你从包中删除导入*
来自 __ init __。py
:
But if you remove the from packages import *
from __init__.py
:
__all__ = ['mod']
您将收到错误消息:
AttributeError: 'module' object has no attribute 'mod'
因为 _ _all __
仅用于包import * 案例中的。
现在我们回到 __ init __。py
导入本身。
because the __all__
is only used for the from packages import *
case.Now we are back to the __init__.py
imports itself.
这篇关于一个包中的python导入模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!