2017-07-26 62 views
0

我有2個python腳本。Python - 導入模塊只有一次

satellite_utils.py 
apply_errata.py 

,我運行的腳本是:在satellite_utils.py定義

python3.4 apply_errata.py 

apply_errata.py通話功能。

現在我正在使用模塊logging來記錄我的消息。我只想導入一次,而不必在每個腳本中聲明它。

如果我定義apply_errata.pylogging和參考在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 

什麼辦法可以避開everyfile import語句?

+0

爲什麼你不想在每個文件中導入它? – bereal

+4

如果你想使用一個模塊,你需要導入它。導入模塊並不意味着它被多次加載。這只是意味着你正在代碼中引用它。 – MrE

+2

每個需要'logging'的模塊都應該'導入​​日誌記錄'。 – user2357112

回答

-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/__ init__.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") 
    
    +0

    您也可以將它們添加到'__init __。py'文件中! 請參閱http://effbot.org/pyfaq/what-is-init-py-used-for.htm – anugrah

    +0

    您對'__init __。py'的描述是錯誤的,並且將所有導入填充到一個模塊中,並且導入* 「這對於循環導入問題來說是一條快捷之路。 – user2357112