我认为你想要的是能够做到这一点:
# some_other_script.py
import module
# Do things using routines defined in module.core
当您要求 Python import module
(在非常基本的意义上)module/__init__.py
运行时,会发生什么情况,并且会创建一个module
对象并将其导入您的命名空间。这个对象(同样,非常基本)包含运行时发生的事情__init__.py
:名称定义等。这些可以通过module.something
.
现在,如果您的设置如下所示:
# module/__init__.py
from module.core import Clazz
c = Clazz()
print c # Note: demo only! Module-level side-effects are usually a bad idea!
当你 import 时module
,你会看到这样的打印语句:
<module.core.Clazz object at 0x00BBAA90>
伟大的。但是,如果您随后尝试访问c
,您将获得NameError
:
# some_other_script.py
import module # prints "<module.core.Clazz object at 0x00BBAA90>"
print c # NameError (c is not defined)
这是因为你还没有导入c
;你已经导入了module
. 相反,如果您的入口点脚本如下所示:
# some_other_script.py
import module # prints "<module.core.Clazz object at 0x00BBAA90>"
print module.c # Access c *within module*
一切都会运行良好。这也可以与from core import *
and/or一起正常工作from module import *
,但我(和 PEP8)建议不要这样做,因为当你开始使用狂野的导入时,脚本中发生了什么并不是很清楚。为了清楚起见:
# module/core.py
def core_func():
return 1
# module/__init__.py
from core import *
def mod_func():
return 2
上面的内容真的很好,尽管您不妨将其设为core
“私有”(重命名为_core
)以表明没有理由再从包外部触摸它。
# some_other_script.py
from module import *
print core_func() # Prints 1
print mod_func() # Prints 2