Python-仅导入一次模块

Python-仅导入一次模块,python,Python,我有两个python脚本 satellite_utils.py apply_errata.py 我运行的脚本是: python3.4 apply_errata.py apply_errata.py调用satellite_utils.py中定义的函数 现在我使用模块日志记录我的消息。我只想导入一次,而不必在每个脚本中声明 如果我在apply_errata.py中定义了日志记录,并在satellite_utils.py中对其进行了引用,我会得到: 我能在每个文件中避免导入语句吗 您可以通过在脚本

我有两个python脚本

satellite_utils.py
apply_errata.py
我运行的脚本是:

python3.4 apply_errata.py
apply_errata.py调用satellite_utils.py中定义的函数

现在我使用模块日志记录我的消息。我只想导入一次,而不必在每个脚本中声明

如果我在apply_errata.py中定义了日志记录,并在satellite_utils.py中对其进行了引用,我会得到:


我能在每个文件中避免导入语句吗

您可以通过在脚本中导入必要的库,然后使用wildchar将该脚本中的所有内容导入到另一个脚本中。通过这样做,您不会再次导入它们,而是引用它们,它们可以在第二个脚本中使用,就像您在第一个脚本中使用它们一样

例如: 1.脚本1.py

import logging
import something
.....
...
log_i=logging.info
log_d=logging.debug
脚本2.py

from Script1 import * #import all in Script1
log_i("this is info log")
log_d("this is debug log")#use the imported data
这里,日志记录在Script1中导入,我将从Script1导入到Script2,这意味着Script1中使用的所有库、变量和函数定义都可以从Script2访问和修改。因此,我在Script2中直接使用日志记录,而不进行任何声明/赋值

根据@anugrah的评论,您可以使用_uinit__uuuuuuy.py初始化目录中的模块,以便可以像上述方法一样导入和使用它们。因此,如果你选择这种方法,那么它会像

abc/___;初始值.py

abc/modules.py

脚本1.py

import logging
import something
.....
...
log_i=logging.info
log_d=logging.debug

您可以在卫星应用程序中使用日志实例,如下所示:

# in apply_errata.py
import satellite_utils
satellite_utils.logger.info('hello there')

这是因为Python文件中定义的任何名称都附加到该文件的全局范围,而Python文件是模块,因此file==module,任何人都可以访问

需要指出的是,我们应该说,这不是一种规范的、更可取的做事方式。你是成年人了,你可以自己决定


为什么多次导入模块不是坏事:它们被Python缓存在sys.modules dict中,所以下次导入时,您只会得到缓存副本

为什么不在每个文件中导入它?如果要使用模块,则需要导入它。导入模块并不意味着要多次加载。这只意味着您正在代码中引用它。每个需要日志记录的模块都应该导入日志记录。您也可以将它们添加到_init__;.py文件中!请参阅您对uuu init_uuuuu.py的描述。py是错误的,将所有导入填充到一个模块中并导入*-这是解决循环导入问题的快速方法。
from abc.modules import log_* #now I'm importing only log_i,log_d
log_i("this is info log")
log_d("this is debug log")
# in apply_errata.py
import satellite_utils
satellite_utils.logger.info('hello there')
# in apply_errata.py
from satellite_utils import logger
logger.info('hi there')