Python自定义模块和导入

时间:2020-01-04 20:16:01

标签: python

我正在遵循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 *来导入所有内容,但是很好奇为什么我们不需要给出标准软件包的完整路径。

2 个答案:

答案 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一样访问它。

所以区别在于,pathos中的变量,而towel_utilstowel_stuff中的子模块。或者说pathos中的导入模块,这使其成为变量。

答案 1 :(得分:1)

通常,例如,如果我们要使用os.path,则无需编写import os.path,而只需导入os就足够了。那么,对于我的内置软件包,为什么我必须给出完整的软件包路径?

这一切都取决于模块的构造方式。例如,如果在您的towel_stuff模块中包括:

from towel_stuff import towel_utils

然后,仅导入towel_stuff的代码将无需另外导入即可访问towel_stuff.towel_utils