[英]Python - import module once only
我有 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
有什么辦法可以避免每個文件中的導入語句?
您可以像這樣使用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 中,所以下次導入時,您將只獲得該緩存副本。 sys.modules 上的 Python 文檔
您可以通過在腳本中導入必要的庫,然后使用通配符將該腳本中的所有內容導入另一個腳本來實現。 通過這樣做,您不是再次導入所有它們,而是引用它們,它們可以在第二個腳本中使用,就像您在 frest 腳本中使用它們一樣。
例如: 1. Script1.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 的評論,您可以使用__init__.py
初始化目錄中的模塊,以便可以像上述方法一樣導入和使用它們。 所以如果你選擇這種方法,那么它會像
abc/__init__.py
abc/modules.py
import logging,os,sys
log_i=logging.info
log_d=logging.debug
腳本1.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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.