好的我有一个问题,我想知道including
中的single php file
多个文件等同于什么(比如说这个文件名为init.php
)。例如init.php
读取Directory X
并包含每个文件*.php
。现在,init.php
导入的这些文件中包含的所有文件都将在脚本(或系统)中共享。
在类似示例中,但这次使用python
,我有一个名为init.py
的文件,使用{{3}读取Directory Y
和imports
每个模块(或包)在import numpy as np, os, sys
中的文件中是否包含Directory Y
等行,或者这些文件中的每一行都需要此import
行吗?为了访问os
和sys
? python示例与php示例有相同或不同的含义吗?为什么?
答案 0 :(得分:2)
如果你import
一个文件,那么Python将执行两个不同的步骤:
import
语句。请注意,如果导入模块foo
,则无法访问命名空间中foo
导入的模块 - 您需要直接导入它们(或通过{{访问它们) 1}},但通常你想在你的模块中导入它们。
简而言之,每个想要使用模块foo.module
的文件都需要导入它,即使同一个应用程序中的其他文件也使用它。
如果你来自另一种语言,可能会让人感到困惑的一件事是Python只会实际执行一次给定的模块(除非你调用foo
),即使它是在很多地方导入的。这就是为什么我将reload()
的动作分成上面的两半 - 第一个只对每个导入的模块执行一次,但第二个总是发生。
因此,如果你import
执行import foo
,那么import bar
和foo
都已加载并执行一次。您的模块可以访问bar
,但不能foo
,因为您尚未导入它(再次,您可以将其用作bar
,但这通常不是很好的做法)。如果您现在运行foo.bar
,那么您的模块中将提供import bar
,但由于该模块已经导入,因此Python将不加载并再次执行该模块
如果您需要更多详细信息,official Python documentation中详细记录了模块的工作方式。
这会回答你的问题吗?
额外详情
通常,您不需要通过扫描目录在运行时加载模块,但有时可能会有用(例如,实现插件)。如果您只想根据安装的模块的固定模块列表进行选择,您可以执行标准bar
并捕获import
并通过尝试列表中的下一个来处理它。
如果做需要在运行时不知道名称时加载模块,则可以使用importlib。 Python标准库还提供several other modules for importing modules,例如imp,它具有按文件名定位和导入模块的功能。
听起来你已经有了解决方案,但有时知道还有什么可用(这些模块都是标准库的一部分,因此总是安装)。