2016-08-03 67 views
0

看來,如果我在我的代碼中調用pip.main(),我的日誌記錄設置將被重置。pip.main()在Python中重置日誌設置

工作例如:

import logging 
import pip 

logger = logging.getLogger() 
logger.setLevel(logging.DEBUG) 

logging.debug("Test") 
# prints 'DEBUG:root:Test' 

pip.main(["install", "requests"]) 
# prints pip output 

logging.debug("Test") 
# doesn't print anything 

任何想法我怎麼能避免這種情況?

+0

你爲什麼調用代碼'pip.main'?這是一件非常奇怪的事情。 – jpmc26

+0

我的項目包含一個使用pip進行安裝的插件管理器。 –

+0

對於'pip'來說它可能不是可以接受的功能,但它就是這樣。海事組織我已經回答你的問題。 –

回答

0

pipinstall命令覆蓋日誌記錄配置。之後您需要自行重置配置,例如在做

logger.setLevel(logging.DEBUG) 

再次呼叫pip.main()後。請注意,如果pip所添加的不是您想要的,您可能還必須添加處理程序。

+0

謝謝,但這不是模塊可接受的功能。 –

+0

@JacobTomlinson它完全適用於設計爲觸發的函數,而不是直接調用命令行工具來設置日誌記錄。 – jpmc26

+0

@ jpmc26我同意這一點,但項目維護人員也同意,在導入它的情況下,它不應該改變根日誌 –

1

事實證明,這是pip module中的known issue

這是因爲創建pip時並不打算將其導入其他程序,因此不考慮更改根日誌記錄配置等考慮事項。

項目維護人員建議的解決方法是使用subprocess模塊來調用pip本身。他們願意提出解決這個問題的請求,但這需要大量的項目工作。

因此我的代碼現在看起來像

import logging 
import subprocess 

logger = logging.getLogger() 
logger.setLevel(logging.DEBUG) 

logging.debug("Test") 
# prints 'DEBUG:root:Test' 

process = subprocess.Popen(["pip", "install", "requests"], 
          shell=False, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE) 
process.wait() 
# prints pip output 

logging.debug("Test") 
# prints 'DEBUG:root:Test'