【问题标题】:Trying to understand module and package imports better试图更好地理解模块和包的导入
【发布时间】:2021-04-06 01:05:31
【问题描述】:

我试图更好地理解 Python 如何从包中识别和定义模块。

当我查看 anaconda 下提供的文件时,将 tkinter 视为一个常见示例>Lib>tkinter 没有 tkinter.py 文件,如果我对 tkinter 目录中的文件进行文本搜索,我看不到 tkinter定义了一个模块,但我可以导入它并使用它。希望得到解释以了解我所缺少的内容?也许它是在 .pyc 文件中定义的?

【问题讨论】:

  • Lib里面应该有tkinter文件夹。

标签: python import module package


【解决方案1】:

我不使用 anaconda;我的只是 python.org 的标准安装。我的Lib 目录中确实有一个tkinter 文件夹——但是没有tkinter.py。与任何软件包一样,该目录中有一个__init__.py 文件,该文件中的内容如下:

import _tkinter # If this fails your Python may not be configured for Tk

这表明我的 Python 应该使用提供必要支持的 _tkinter 的 C 库实现来构建。

你确定没有tkinter目录

更新

当您import tkinter 时,在这种情况下您正在导入一个,因为tkinter 是一个包含__init__.py 文件的目录。结果是__init__.py 被加载并执行。该文件中的全局名称成为tkinter 模块的属性。例如,该文件中的函数_join 可以作为tkinter._join 访问。但也因为该文件中有import sys 语句,您甚至可以访问tkinter.sys。或者,如果您愿意,可以说,from tkinter import sys

但你也可以说from tkinter import messagebox。为什么?没错,__init__.py 中没有 messagebox 定义,但tkinter 目录中有一个messagebox.py 文件,这就是可以加载其他子模块的方式。

__init__.py 文件必须存在于所有包的目录中,并将目录定义为包,它包含在导入包名称时初始化包的代码。它可能包含导入包的某些常用子模块的代码。很多时候文件只是空的,但需要存在。

【讨论】:

  • 谢谢。是的,有一个 tkinter 目录,但没有文件。我还为此查看了 init.py 文件并看到了对 _tkinter 的引用。但是 init.py 本身会导入 tkinter。那么 tkinter 的原始定义在哪里呢?它是从目录名 'tkinter' 推断出来的还是存在于其他地方?
  • @Jez 目录名称
  • 查看我对答案的更新。是的,是从目录名推断出来的。
  • @Booboo 谢谢你的回答,现在知道了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2014-02-11
  • 2018-07-05
  • 2011-12-29
  • 1970-01-01
相关资源
最近更新 更多