我正在遵循this示例,说明如何打包python模块。但是,当我尝试使用pip来安装构建的软件包时,可以进行以下操作。
from towel_stuff import towel_utils
x = towel_utils.has_towel()
print(x)
这也可以,
import towel_stuff.towel_utils
x = towel_stuff.towel_utils.has_towel()
print(x)
我不明白,以下原因为何不起作用。
import towel_stuff
x = towel_stuff.towel_utils.has_towel()
print(x)
通常,例如,如果我们要使用os.path
,则无需编写import os.path
,而只需写import os
就可以了。那么,对于我的内置软件包,为什么我必须给出完整的软件包路径?
我当然可以使用from towel_stuff import *
来导入所有内容,但是很好奇为什么我们不需要给出标准软件包的完整路径。
答案 0 :(得分:2)
给出以下结构:
towel_stuff
----__init__.py
----towel_utils
使用import towel_stuff
时,唯一执行的文件是__init__.py
,因此,如果您没有在towel_utils
中导入__init__.py
,则根本无法访问该文件。 / p>
简而言之,当您使用import a_module
时,您正在并且仅在执行该模块目录中的__init__.py
文件。如果要访问a_module.file
,则需要显式导入。
使用import a_file
时,您正在执行该文件,因为path
只是os
的变量,因此可以像os.path
一样访问它。
所以区别在于,path
是os
中的变量,而towel_utils
是towel_stuff
中的子模块。或者说path
是os
中的导入模块,这使其成为变量。
答案 1 :(得分:1)
通常,例如,如果我们要使用os.path,则无需编写import os.path,而只需导入os就足够了。那么,对于我的内置软件包,为什么我必须给出完整的软件包路径?
这一切都取决于模块的构造方式。例如,如果在您的towel_stuff
模块中包括:
from towel_stuff import towel_utils
然后,仅导入towel_stuff
的代码将无需另外导入即可访问towel_stuff.towel_utils
。