⑴ 如何動態修改python logging配置文件
配置文件:
#Configuration for log output
#Naiveloafer
#2012-06-04
[loggers]
keys=root,xzs
[handlers]
keys=consoleHandler,fileHandler,rotatingFileHandler
[formatters]
keys=simpleFmt
[logger_root]
level=DEBUG
#handlers=consoleHandler
#handlers=fileHandler
handlers=rotatingFileHandler
[logger_xzs]
level=DEBUG
handlers=rotatingFileHandler
qualname=xzs
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFmt
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFmt
args=("../log/p2pplayer.log", "a")
[handler_rotatingFileHandler]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=simpleFmt
args=("../log/p2pplayer.log", "a", 20*1024*1024, 10)
[formatter_simpleFmt]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s - [%(filename)s:%(lineno)s]
datefmt=
測試代碼:
def log_test02():
import logging
import logging.config
CONF_LOG = "../conf/p2pplayer_logging.conf"
logging.config.fileConfig(CONF_LOG); # 採用配置文件
logger = logging.getLogger("xzs")
logger.debug("Hello xzs")
logger = logging.getLogger()
logger.info("Hello root")
if __name__ == "__main__":
log_test02()
輸出:
2012-06-04 15:28:05,751 - xzs - DEBUG - Hello xzs - [xlog.py:29]
2012-06-04 15:28:05,751 - root - INFO - Hello root - [xlog.py:32]
具體就不詳細說明了,總之是能夠運行的,這個文件配置搞了我兩天時間。
特別是class=XXXX要注意!!!
⑵ 用python類的形式怎樣做管理系統-Python配置管理的幾種方式
一、 為什麼要使用配置
如果我們在較復雜的項目中不使用配置文件,我們可能會面臨下面的情況:
你決定更改你的項目中資料庫的 host, 因為你要將項目從測試環境轉移到實際的生產環境中。如果你的項目中多個位置用到了這個 host,那你不得不一個一個找到這些位置再修改成新的 host。花了半天,然後過了一天,你發現項目在生產環境有些問題,需要重新移回測試環境,你得再次修改,這樣工作很繁瑣很不優雅。
你開發了一個很棒的開源項目,你想將其放到版本控制系統例如github上,但是你伺服器的主機的地址、賬號、密碼也都上傳上去了,但是你沒有意識到,直到有個 bad guy 拿到了你的信息,從你的伺服器竊取信息、攻擊你的伺服器,讓你產生了極大的損失。然後你想把程序改動一下,把涉密的信息比如地址密碼都刪掉,可是由於版本控制的原因,別人依然能看到你以前版本的代碼。於是你不得不改掉你的賬戶、密碼等,真的是個悲傷的開源項目經歷。
但是,如果你使用了配置管理呢,那會有以下幾個優點:
這樣就提高了代碼的重用性,不再每次都去修改代碼內部
這意味著其他不太懂你代碼內部的人也可以使用你的項目,只用根據需求更改配置即可
有利於團隊協作
有利於安全數據/秘密數據的管理
二、Python 中進行配置管理的幾種方式
由於使用 Python 較多,因此基於 Python 進行配置管理的相關說明,當然其他語言也都是大同小異,主要思想還是不變。
2.1 使用 Python 內置的數據結構(如字典)
2.1.1單個文件下的單個配置
我們很自然就能想到這一點,例如以下代碼:
在上面的代碼中,我們可以看到,同一資料庫配置,我們反復使用了兩次,如果我們需要更改資料庫相關的數據如password,我們不需要在兩個方法內部修改,而是只用修改DATABASE_CONFIG字典中的相關值即可。和以前沒有配置管理的時候相比,減少了太多的工作量了。
2.1.2多個文件下的單個配置
但是當你的項目開始變得復雜的時候,你的文件就不止一個這么簡單了,這時候如果我需要在 main2.py 裡面需要用 DATABASE_CONFIG 的時候就不是很方便了,因為如果直接 import main 的時候,雖然能夠使用 main.DATABASE_CONFIG ,但同時 mian.py 中的
也被執行了,這可不是我們想看到的,因此我們有了新的需求,能在同一個項目下的不同文件里簡單快速的導入我們的資料庫配置 DATABASE_CONFIG,於是我們想出了下面的方法來解決這個問題:
按照上面的代碼,我們可以在兩個不同的文件 main1.py 和 main2.py 中分別引用 config.py 中配置了,我們的配置管理看起來更進一步了。
2.1.3 單個文件下的多個配置
有可能我們的項目需要多個配置文件,比如測試環境和生產環境。先從單個文件講起,我們可以採用如下解決方案:
這樣我們就可以從一個配置文件中獲取不同級別的不同配置了。
2.1.4 多個文件下的多個配置
和上面類似,只不過換成了從不同的文件中讀取同一個配置文件的不同配置:
這樣使用更加靈活了,從不同的文件里讀取不同的配置,而我們對於配置的增刪改只需要在 config.py 中進行,配置管理技能再次進階!
2.2 使用外部配置文件
比起使用 Python 內建的數據結構,更加通用的方法是使用外部配置文件,因為這些文件只會被視為配置文件,而不會像 config.py 一樣有代碼的屬性。外部配置文件的格式多種多樣,我們在使用它的時候會根據文件格式有不同的讀取方式。例如:*.yaml 或者 *.yml、*.json、*.cfg 或 *.conf 、*.ini , 甚至是你自定義的文件 *.yourname 。
2.2.1 YAML
YAML(/ˈjæməl/,尾音類似camel駱駝)是一個可讀性高,用來表達數據序列化的格式。YAML參考了其他多種語言,包括:C語言、Python、Perl,並從XML、電子郵件的數據格式(RFC 2822)中獲得靈感。Clark Evans在2001年首次發表了這種語言[1],另外Ingy döt Net與Oren Ben-Kiki也是這語言的共同設計者[2]。當前已經有數種編程語言或腳本語言支持(或者說解析)這種語言。
----- 中文維基網路
YAML 看起來像下面這種格式:
如果需要從 python 寫入配置到 YAML 也很容易,只需要使用 yaml.mp(dict) 即可,dict 指的是配置的字典。更加詳細的內容可以查看 PyYAML Documentation
2.2.2 INI
INI文件是一個無固定標准格式的配置文件。它以簡單的文字與簡單的結構組成,常常使用在Windows操作系統,或是其他操作系統上,許多程序也會採用INI文件做為設置程序之用。Windows操作系統後來以注冊表的形式取代掉INI檔。INI文件的命名來源,是取自英文「初始(Initial)」的首字縮寫,正與它的用途——初始化程序相應。有時候,INI文件也會以不同的擴展名,如「.CFG」、「.CONF」、或是「.TXT」代替。
----- 中文維基網路
它長得像這樣:
這將輸出 INI 配置文件中的 mysql section 中的 host 值
要寫入 INI 配置文件也很簡單,參考如下代碼即可:
2.2.3 JSON
JSON是JavaScript對象表示法的縮寫。它非常廣泛,因此對許多編程語言都有很好的支持。它的格式大家也很眼熟,看起來和 Python 中的字典很像:
要將配置寫入json中也很簡單,參考以下代碼:
其他格式的文件大多如此,就不贅述了。並且外部的配置文件中也可以配置多個配置(mysql, other等)
2.3 使用環境變數
但是,回到我們開篇講的問題,以上的兩種配置管理方案(使用 Python 內置的數據結構、使用外部配置文件) 都忽略了兩個問題:
其一,我們如何應對安全數據直接曝光於公眾的可能問題呢,如果我們需要使用版本控制系統例如 Github,或許我們可以嘗試將 config.py 文件放到 .gitignore 裡面,但我們如果哪一天修改了倉庫,忘了將 config.py 忽略掉而 push 到了GitHub 上,那麼我們的安全敏感信息仍然會向公眾泄露,由於版本控制的存在,即使你刪掉了還會有這條提交記錄,處理起來會很麻煩。
其二,如果我們要在我們本地新開一個項目,這個項目也需要引用一樣的資料庫配置文件,或許我們可以找到第一個項目的文件夾,復制出 config.py 到 新的項目文件夾。嗯,看起來可行,但是,如果你要新開十幾個項目呢,幾百個項目呢?
因此我們可以引入下一種配置管理的方式,對解決上面提出的兩個問題都是較為友好的解決方案,即使用環境變數,各種開發環境(Win、Mac、linux)的系統環境變數的設置方式有所不同,可以參考這篇文章。
另外 PyCharm 和 VS Code 有更加方便的配置方式,可以為不同的項目分配不同的設置。
PyCharm 中,在菜單 Run->Edit configurations 中,手動設置Environment variables
VS Code 中,在 Setting 中搜索 env ,在 Terminal 中選擇你的操作系統相關的Terminal > Integrated > Env: Your OS ,點擊 settings.json 進行添加
使用環境變數配置值不用作為單獨的文件進行管理,因此有較小的安全風險,它很容易使用,可以在你的開發環境中的任何項目任何代碼庫中使用,但是它的管理方式可能有些復雜。有些環境無法使用環境變數,比如Apache,Nginx等Web伺服器,這時候就需要採用其他的方式。
2.4 使用動態載入
這種方法比利用 Python 內置的數據結構更加先進,內置數據結構的方法要求配置文件必須要在可以直接 import 的路徑上。但是動態載入中,配置文件不必在可直接導入的路徑上,甚至可以位於其他存儲庫中,這樣的話,配置文件就和項目分隔開了,其他的項目也可以動態載入這個配置文件,例如:
三、總結
以上歸納了四種配置管理的方式,總體來說沒有優劣之分,看個人的需要,甚至上面的幾種方法可以混合使用,對於一些軟體項目,它自身可能就提供了相關的變數配置入口,比如 airbnb 的 Airflow 。而且,當系統規模非常大時,最好使用主要提供配置管理的第三方工具或服務,相關服務可以參考這里。
⑶ linux新安裝python怎麼配置文件
首先把Boost庫的頭文件存放到/usr/include/boost/路徑下,再把Lib文件存放到/usr/local/lib/boost/路徑下。修改/etc/profile文件,在此文件中增加如下2個環境變數: BOOST_INCLUDE=/usr/include/boost export BOOST_INCLUDE BOOST_LIB=/usr/loca...
⑷ 怎麼在python中創建配置文件
沒辦法設置默認編輯器,因為可能和其他的無後綴文件沖突。你可以這樣右鍵->open with..->Other.. 在裡面找到你的python編輯器。
⑸ 如何使用Python3讀取配置文件
ini是微軟Windows操作系統中的文件擴展名(也常用在其他系統)。
INI是英文「初始化(Initial)」的縮寫。正如該術語所表示的,INI文件被用來對操作系統或特定程序初始化或進行參數設置。通過它,可以將經常需要改變的參數保存起來(而且還可讀),使程序更加的靈活。
先給出一個ini文件的示例。
[School]
ip=10.15.40.123
mask=255.255.255.0
gateway=10.15.40.1
dns=211.82.96.1
[Match]
ip=172.17.29.120
mask=255.255.255.0
gateway=172.17.29.1
dns=0.0.0.0
這個配置文件中保存的是不同場合下的IP設置參數。
首先,Python讀取ini配置需要用到ConfigParser包,所以要先載入它。
importconfigparser
之後我們需要載入配置文件。
config=configparser.ConfigParser()
#IpConfig.ini可以是一個不存在的文件,意味著准備新建配置文件。
config.read("IpConfig.ini")
接下來,我們可以使用configparser.add_section()向配置文件中添加一個Section。
#添加節School
config.add_section("School")
注意:如果文件中已經存在相應的項目,則不能再增加同名的節。
然後可以使用configparser.set()在節School中增加新的參數。
#添加新的IP地址參數
config.set("School","IP","192.168.1.120")
config.set("School","Mask","255.255.255.0")
config.set("School","Gateway","192.168.1.1")
config.set("School","DNS","211.82.96.1")
你可以以同樣的方式增加其它幾項。
#由於ini文件中可能有同名項,所以做了異常處理
try:
config.add_section("Match")
config.set("Match","IP","172.17.29.120")
config.set("Match","Mask","255.255.255.0")
config.set("Match","Gateway","172.17.29.1")
config.set("Match","DNS","0.0.0.0")
exceptconfigparser.DuplicateSectionError:
print("Section'Match'alreadyexists")
增加完所有需要的項目後,要記得使用configparser.write()進行寫入操作。
config.write(open("IpConfig.ini","w"))
以上就是寫入配置文件的過程。
接下來我們使用configparser.get()讀取剛才寫入配置文件中的參數。讀取之前要記得讀取ini文件。
ip=config.get("School","IP")
mask=config.get("School","mask")
gateway=config.get("School","Gateway")
dns=config.get("School","DNS")
print((ip,mask+" "+gateway,dns)
下面是一個完整的示常式序,它將生成一個IpConfig.ini的配置文件,再讀取文件中的數據,輸出到屏幕上。
#-*-coding:utf-8-*-importconfigparser#讀取配置文件config=configparser.ConfigParser()config.read("IpConfig.ini")#寫入宿舍配置文件try:config.add_section("School")config.set("School","IP","10.15.40.123")config.set("School","Mask","255.255.255.0")config.set("School","Gateway","10.15.40.1")config.set("School","DNS","211.82.96.1")exceptconfigparser.DuplicateSectionError:print("Section'School'alreadyexists")#寫入比賽配置文件try:config.add_section("Match")config.set("Match","IP","172.17.29.120")config.set("Match","Mask","255.255.255.0")config.set("Match","Gateway","172.17.29.1")config.set("Match","DNS","0.0.0.0")exceptconfigparser.DuplicateSectionError:print("Section'Match'alreadyexists")#寫入配置文件config.write(open("IpConfig.ini","w"))ip=config.get("School","IP")mask=config.get("School","mask")gateway=config.get("School","Gateway")dns=config.get("School","DNS")print((ip,mask+" "+gateway,dns))
⑹ python3 如何創建一個.ini的配置文件。
1、說明:
python3使用configparser模塊來處理ini配置文件。
2、代碼示例:
需要生成conf.ini配置文件如下:
[config]
v1 = 100
v2 = abc
v3 = true
v4 = 123.45
python代碼:
import configparser
# 載入現有配置文件
conf = configparser.ConfigParser()
# 寫入配置文件
conf.add_section('config') #添加section
# 添加值
conf.set('config', 'v1', '100')
conf.set('config', 'v2', 'abc')
conf.set('config', 'v3', 'true')
conf.set('config', 'v4', '123.45')
# 寫入文件
with open('conf.ini', 'w') as fw:
conf.write(fw)
# 讀取配置信息
v1 = conf.getint('config', 'v1')
v2 = conf.get('config', 'v2')
v3 = conf.getboolean('config', 'v3')
v4 = conf.getfloat('config', 'v4')
print('v1:', v1)
print('v2:', v2)
print('v3:', v3)
print('v4:', v4)
打開conf.ini文件檢查內容
3、模塊常用函數:
1)讀取配置文件
read(filename) 直接讀取ini文件內容
sections() 得到所有的section,並以列表的形式返回
options(section) 得到該section的所有option
items(section) 得到該section的所有鍵值對
get(section,option) 得到section中option的值,返回為string類型
getint(section,option) 得到section中option的值,返回為int類型,還有相應的getboolean()和getfloat() 函數。
2)寫入配置文件
add_section(section) 添加一個新的section
set( section, option, value) 對section中的option進行設置,需要調用write將內容寫入配置文件。