3

好的,我有一个问题,我想知道将including许多文件等效为一个single php file(比如说这个文件被称为init.php)。例如init.php读取Directory X并包含每个文件*.php。导入的这些文件中包含的任何文件init.php现在都将在脚本(或系统)之间共享。

在类似的示例中,但这次使用python,我有一个名为的文件init.py,它会读取Directory Y并且每个使用find_packages()imports的模块(或包)将诸如包含在其中的文件中的行,或者这些文件中的每一个都需要这一行吗?为了访问and ? python 示例是否与 php 示例具有相同或不同的含义?为什么?import numpy as np, os, sysDirectory Yimportossys

4

1 回答 1

7

如果你import是一个文件,那么 Python 将执行两个不同的步骤:

  1. 打开导入的模块文件并执行它,包括import模块中的任何语句。
  2. 使导入的模块在当前模块的命名空间中可用。

请注意,如果您导入模块,foo那么您将无法访问foo命名空间中导入的模块 - 您需要直接导入它们(或通过 访问它们foo.module,但通常您希望在模块中导入它们)。

简而言之,每个想要使用模块的文件都foo需要导入它,即使同一应用程序中的其他文件也使用它。

如果您来自另一种语言,可能会令人困惑的一件事是,Python 仅实际执行一次给定模块(除非您调用reload()),即使它已在许多地方导入。这就是为什么我将import上面的操作拆分为两半——第一个只对每个导入的模块执行一次,但第二个总是发生。

因此,如果您执行import foowhich 本身执行,import bar则两者都已加载并执行一次foobar您的模块可以访问foo,但bar因为您没有导入它(同样,您可以将其用作foo.bar,但这通常不是很好的做法)。如果您现在运行,import bar那么您将bar在您的模块中可用,但是由于该模块已经被导入,Python 将不会再次加载和执行该模块。

如果您需要更多详细信息,官方 Python 文档中详细记录了模块如何工作的细节。

这是否回答你的问题?

额外细节

通常您不需要在运行时通过扫描目录来加载模块,但在某些情况下这可能很有用(例如实现插件)。如果您只想在已安装的模块的固定列表之间进行选择,您可以做一个标准并通过尝试列表中的下一个来import捕获并处理它。ImportError

如果在运行时才知道名称时确实需要加载模块,则可以使用importlib。Python 标准库还提供了其他几个用于导入模块的模块,例如imp,它具有通过文件名定位和导入模块的功能。

听起来您已经有了解决方案,但有时了解其他可用的模块很有用(这些模块都是标准库的一部分,因此始终安装)。

于 2013-01-10T12:01:47.740 回答