簡體   English   中英

Python - 只導入一次模塊

[英]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記錄我的消息。 我只想導入一次,而不必在每個腳本中都聲明它。

如果定義loggingapply_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
  1. 腳本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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM