【问题标题】:Importing python modules for use in only one file导入python模块以仅在一个文件中使用
【发布时间】:2011-12-04 04:09:48
【问题描述】:

更具体地说,假设我有许多 .py 文件,其中 main.py 导入诸如 os、pygame、math 和我所有其他 .py 文件、mymodule01.py 等内容。

我的问题是,每当 main.py 调用我的一个 .py 文件并且该文件包含类似 os.listdir() 的内容时,我都会不断收到错误消息,提示“未定义 os”。

我应该只在我编写的每个 .py 文件中导入所有必需的模块,还是有更好的方法,例如每个文件都可以识别的集中导入?尤其是使用 pygame,这将非常令人困惑,因为我必须在每个文件中初始化 pygame 才能使用它的功能,更不用说我是否想在屏幕上显示某些东西。

python 模块和包文档并没有太大帮助,或者我真的很慢,还考虑到在遵循文档后,我在添加例如后不断收到未找到的错误。在包含文件夹的 init.py 文件中导入 mymodule01.py。

【问题讨论】:

  • +1 一个有价值的问题。为了放大所选答案中的一点,import 可以被认为是授予对另一个命名空间的访问权限;它加载代码(每个解释器只加载一次)几乎可以被认为是一种副作用。

标签: python import module package


【解决方案1】:

我是否应该在我编写的每个 .py 文件中导入所有必需的模块

是的。

尤其是使用 pygame,这将非常令人困惑,因为我必须在每个文件中初始化 pygame 才能使用它的功能

不,只初始化一次。该模块只有一份副本。

【讨论】:

  • 所以我假设当我想对一个表面进行 blit 时,我必须在我初始化 pygame 的模块中执行此操作,并且我在其他模块中提出的任何表面我都必须将它们传递给初始化模块?
  • 一点也不;你所有的小模块都共享同一个pygame 模块,不管它在哪里inited。您只需要在每个使用它的模块中导入它,以将名称“pygame”本地绑定到模块。一旦 init 完成,pygame 的其他一切都应该在调用发生的任何地方都能正常工作(尽管您可能想考虑一个 MVC-ish 设计)。
  • 谢谢,没有我当时担心的那么糟糕。
【解决方案2】:

我认为您可能认为“导入”在其他语言中的行为类似于“包含”。没有。

每个模块对象都是一个单例。多次初始化模块代码不会导致性能下降或危险。

此外,每个文件都有自己的范围,因此在您的示例中,如果您在 main.py 中定义 foo = 1foomymodule01.py 中将不可见。你必须import main; main.foo 才能看到它(不是你应该)

你抱怨,但这是一个比include更好的系统

【讨论】:

  • 我很确定我是以错误的心态来处理这个问题的,而且我确实有一种模糊的印象,即导入相当于每次调用模块的代码时都对其进行初始化。感谢您解决这个问题。
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 2019-12-22
  • 2022-01-08
  • 2021-09-18
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多