假设您创建了一个名为cron
的Python包,它包含一个名为app
的模块,该模块有一个名为foo
的函数,可以将say_hello
打印到控制台
假设您还创建了第二个名为Hello!
的Python包,其中包含模块boss_app
。 main
和app
位于同一目录中,目录位于Python路径中。此外,boss_app
文件都是空白的。结构是:
__init__
我想将app
__init__.py
foo.py
boss_app
__init__.py
main.py
导入app
,以便我可以致电boss_app.main
。
我使用这个命令:
app.foo.say_hello
我希望在控制台中看到:
import app
app.foo.say_hello()
相反,我得到的行为是>>>> Hello!
导入但是它无法访问app
。
我提出的解决方案是修改foo
,使其包含以下命令:
app.__init__
现在我得到了预期的行为。
如果要从外部包导入该包,是否始终需要为包创建自定义from .foo import *
?
答案 0 :(得分:1)
说
import app
仅运行app/__init__.py
并使其初始化的所有内容都可用作app.SOMENAME
。如果您希望app.foo
模块可用,则需要说import app.foo
。这将加载模块。这种区别的一个常见例子可能是import os
vs import os.path
。仅仅因为您说import os
,您就无法获得os.path
个套餐的内容。
您不必将模块分解为软件包,但它有助于避免模块名称冲突。它也可能有助于在这些模块的用户的脑海中清楚地理解概念。