在一个包中,我在每个模块目录的__init__.py
中使用了一些检查来查看环境是否正常,然后使用from . import mod1
来嵌套模块(mod1
这里)。每个模块目录依次包含一个__init__.py
(显然),它将导入下一个较低级别(如果有的话)。
部分__init__.py
包含__all__
数组,仅在import
上公开某些名称。
假设我有以下“主要”脚本(spam.py
):
import os, sys
if (sys.version_info[0] != 2) or (sys.version_info < (2,7)):
sys.exit("...")
else:
import pkgname
def main():
pass
if __name__ == '__main__':
main()
以及以下pkgname/__init__.py
:
import sys
if __name__ == '__main__':
sys.exit(0)
else:
from . import db
from os.path import dirname, realpath
sys.modules[__name__].__all__ = ['inipath']
sys.modules[__name__].__dict__['inipath'] = dirname(realpath(__file__)) + '.ini'
以及以下pkgname/db/__init__.py
:
import sys
if __name__ == '__main__':
sys.exit(0)
else:
import sqlite3
# ...
foobar = { 'spam' : 'egg' }
__all__ = ["foobar"]
尽管pkgname.db.foobar
中有__all__
数组,但仍可以看到符号pkgname/__init__.py
吗?即__all__
数组是否只影响立即模块或任何较低级别?
哪些规则管理Python的行为?我尝试了一些搜索,但空手而归。可能我使用了错误的搜索(__all__
,python
,relative import
)?
答案 0 :(得分:4)
__all__
对您描述的情况无效。它只影响from package import *
时发生的事情。请参阅the documentation以及previous questions(我通过Google搜索python __all__
找到的)。