我目前的理解是,当一个人写from foo import bar
,foo
这是一个包并拥有__init__.py
时,会自动处理其__init__.py
,之后会显示其资源{ {1}}将被导入。如果在命令提示符下,我写bar
,并在该模块中调用python manage.py
,在属于foo包的from foo import bar
中,变量__init__.py
则等于包裹名字?在这种情况下foo?
答案 0 :(得分:5)
在包的__init__
模块中,__name__
设置为包的名称;例如模块存储在sys.modules
下的内容。
对于包foo
,__name__
设置为'foo'
:
>>> import os
>>> os.mkdir('foo')
>>> open('foo/__init__.py', 'w').write('print "__name__:", __name__')
>>> open('foo/bar.py', 'w').write('# nothing done here')
>>> from foo import bar
__name__: foo
>>> import sys
>>> sys.modules['foo']
<module 'foo' from 'foo/__init__.py'>
>>> sys.modules['foo'].__name__
'foo'
请注意,每个Python模块都有一个__name__
变量;甚至是最初的脚本。如果您运行python manage.py
,则初始脚本将作为__main__
模块加载,因此* manage.py
中的名称将设置为'__main__'
;此名称不会随脚本导入的内容而改变。
答案 1 :(得分:-2)
__name__
属于您使用python调用的模块的本地范围(属性),即:在本例中为manage.py
。