我有2个python脚本。
satellite_utils.py
apply_errata.py
我运行的脚本是:
python3.4 apply_errata.py
apply_errata.py
调用satellite_utils.py
中定义的函数。
现在我使用模块logging
来记录我的消息。我想只导入一次而不必在每个脚本中声明它。
如果我在logging
中定义apply_errata.py
并在satellite_utils.py
中对其进行了引用,我会得到:
Traceback (most recent call last):
File "apply_errata.py", line 20, in <module>
satellite_utils.applyErrata(args.release, args.all, args.rollback)
File "/root/config-3.1.21/automated-os-patching/satellite_utils.py", line 34, in applyErrata
applyErrataOnSystem(system, release, automaticRollback, [erratum])
File "/root/config-3.1.21/automated-os-patching/satellite_utils.py", line 39, in applyErrataOnSystem
logging.warning('is when this event was logged.')
NameError: name 'logging' is not defined
任何方式我都可以避免每个文件中的import语句?
答案 0 :(得分:0)
您可以像这样使用 satellite_utils
中的日志记录实例:
# 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')
这是可行的,因为在 Python 文件中定义的任何名称都附加到该文件的全局范围(在 Python 文件中是模块,因此文件 == 模块),并且任何人都可以访问。
重要的是要指出,这不是规范和首选的做事方式。你是成年人了,你可以自己决定。
为什么多次导入模块还不错:它们被 Python 缓存在 sys.modules
dict 中,所以下次导入时,您只会获得该缓存副本。 Python docs on sys.modules
答案 1 :(得分:-1)
您可以通过在脚本中导入必要的库,然后使用wildchar将该脚本中的所有内容导入另一个脚本来实现。通过执行此操作,您不会再次导入所有这些,而是引用它们,并且可以在第二个脚本中使用它们,就像您在friest脚本中使用它们一样。
例如: 1. Script1.py
import logging
import something
.....
...
log_i=logging.info
log_d=logging.debug
Script2.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的评论,您可以使用__init__.py
初始化目录中的模块,以便像上述方法一样导入和使用它们。因此,如果您选择此方法,那么它就像
<强> ABC / __初始化__。PY 强>
<强> ABC / modules.py 强>
import logging,os,sys
log_i=logging.info
log_d=logging.debug
<强> Script1.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")