python實現配置文件的更新的簡單介紹

本文目錄一覽:

如何進行python項目配置管理?這才是你最需要的python技術

每次開始一個新的 Python 項目,我都會為怎麼管理配置文件而頭疼。不過在遷移我的博客時,終於有空花了點時間,把這件事想清楚。

一年多的時間過去了,一切似乎都很順利,連我在知乎所做的新項目也沿用了該方案,於是決定把解決方案記錄下來。

先說說我要解決什麼哪些Python項目的配置管理問題吧:

可以區分各種環境。

在開發、測試和生產等環境,都可能用到不同的配置,所以能區分它們是一個很基本的需求。

可以有通用的配置項。

各種環境的配置中,需要修改的只佔一小部分。因此通用的部分應該不需要重複定義,否則會帶來維護成本。

可以分成多個部分/模塊。

隨着Python項目的配置管理項的增多,找起配置來會花大量時間,所以劃分它們對維護配置很有幫助。

可以直接使用 Python 代碼。

從文本文件中解析出變量值太麻煩,而且不方便生成批量的數據(例如數組),也不好通過函數調用來生成配置值(例如獲取文件路徑)。

可以將公開和私有的配置文件分開管理。

在開源項目中,應只包含公開的配置項,而不包含私有的配置。不過這個需求對私有項目而言,沒什麼意義。

工作中我先後使用了幾種Python項目的配置管理方式,主要使用的就兩種:

為每個環境分別寫一個配置文件,到相應的環境里,將該環境的配置文件軟鏈接到正確的路徑。

如何進行python項目配置管理?使用分佈式的配置服務,從遠程獲取配置。

前者用起來其實蠻麻煩的,特別是想在本地跑單元測試時,需要替換成單元測試環境的配置文件。所以我又把環境變量給加了進來,檢測到指定的環境變量,就加載單元測試的配置。而其他幾個需求也能勉強實現,不過並不優雅。

後者不能直接使用 Python 代碼,網絡不好時需要降級成使用本地緩存,獲取配置服務器的地址需要配置,配置服務器自己也需要配置,而且配置服務器還可能掛掉(知乎內網遇到過全部五台配置服務器都掛掉的情況),所以我用得比較少。

其實仔細想想就能發現,「使用 Python 代碼」也就意味着是 Python 源文件,「有通用的配置項」用 Python 實現就是繼承,似乎沒更好的選擇了。

如何進行python項目配置管理?於是定義一個 Config 類,讓其他環境的配置都繼承這個類:

# config/default.pyclass Config(object):

DEBUG_MODE = True

PORT = 12345

COOKIE_SECRET = ‘default’

REDIS_CONFIG = {‘host’: ‘localhost’, ‘port’: 6379, ‘db’: 0} # …

# config/development.pyfrom .default import Configclass DevelopmentConfig(Config):

COOKIE_SECRET = ‘dev’

# config/unit_testing.pyfrom .default import Configclass UnitTestingConfig(Config):

REDIS_CONFIG = {‘host’: ‘localhost’, ‘port’: 6379, ‘db’: 1}

# config/production.pyfrom .default import Configclass ProductionConfig(Config):

COOKIE_SECRET = ‘…’

REDIS_CONFIG = {‘unix_socket_path’: ‘/tmp/redis.sock’}

為了讓每種環境都只有一個配置生效,還需要加一個策略:[page]

# config/__init__.pyimport loggingimport os

env = os.getenv(‘ENV’) # 可以改成其他名字,自己進行設置try: if env == ‘PRODUCTION’: from .production import

ProductionConfig as CONFIG

logging.info(‘Production config loaded.’) elif env == ‘TESTING’: from .testing import TestingConfig as CONFIG

logging.info(‘Testing config loaded.’) elif env == ‘UNIT_TESTING’: from .unit_testing import UnitTestingConfig as

CONFIG

logging.info(‘Unit testing config loaded.’) else: # 默認使用本地開發環境的配置,省去設置環境變量的環節

from .development import DevelopmentConfig as CONFIG

logging.info(‘Development config loaded.’)except ImportError:

logging.warning(‘Loading config for %s environment failed, use default config instead.’, env or ‘unspecified’)

from .default import Config as CONFIG

這樣只需要在跑應用前,設置不同的環境變量即可。如果是用 Supervisor 維護進程的話,加上一行environment = ENV=”PRODUCTION”配置即可。

當然還可以加其他的規則,例如沒環境變量時,再檢查機器名等。

如何進行python項目配置管理?現在前兩個需求都解決了,再來看分模塊的功能。

這個需求正好對應 Python 的 package,於是把每個Python項目的配置管理文件改成一個 package 即可。接着是如何同時滿足第二和第三個需求。

舉例來說,有這樣的配置:

# config/default.pyclass Config(object):

ROOT_PATH = ‘/’

LOGIN_PATH = ROOT_PATH + ‘login’

SCHEME = ‘http’

DOMAIN = ‘localhost’

ROOT_URL = ‘%s://%s%s’ % (SCHEME, DOMAIN, ROOT_PATH)

# config/production.pyfrom .default import Configclass ProductionConfig(Config):

ROOT_PATH = ‘/blog/’

LOGIN_PATH = ROOT_PATH + ‘login’

DOMAIN = ”

ROOT_URL = ‘%s://%s%s’ % (Config.SCHEME, DOMAIN, ROOT_PATH)

其中,LOGIN_PATH 和 LOGIN_URL 的設置邏輯其實是一樣的,但值卻不同,在 ProductionConfig 中重新賦值一次有點不太優雅。

於是把這些設置提取出來,在基本設置初始化以後,再進行設置:

class _AfterMeta(type):

def __init__(cls, name, bases, dct):

super(_AfterMeta, cls).__init__(name, bases, dct)

cls._after()class Config(object):

__metaclass__ = _AfterMeta

ROOT_PATH = ‘/’

SCHEME = ‘http’

DOMAIN = ‘localhost’ @classmethod

def _after(cls):

cls.LOGIN_PATH = cls.ROOT_PATH + ‘login’

cls.ROOT_URL = ‘%s://%s%s’ % (cls.SCHEME, cls.DOMAIN, cls.ROOT_PATH)

# config/production.pyfrom .default import Configclass ProductionConfig(Config):

ROOT_PATH = ‘/blog/’

DOMAIN = ”

如何進行python項目配置管理?所有有依賴的設置項,都在 _after 方法里賦值即可。

不過這樣可能導致靜態檢查和代碼提示出問題,而且使得所有子類都重新定義這些屬性,即便沒有修改父類的屬性,或是覆蓋掉手動設置的值。所以可以再修改一下:[page]

class _AfterMeta(type):

def __init__(cls, name, bases, dct):

super(_AfterMeta, cls).__init__(name, bases, dct)

cls._after(dct)class Config(object):

__metaclass__ = _AfterMeta

ROOT_PATH = ‘/’

LOGIN_PATH = ROOT_PATH + ‘login’

SCHEME = ‘http’

DOMAIN = ‘localhost’

ROOT_URL = ‘%s://%s%s’ % (SCHEME, DOMAIN, ROOT_PATH) @classmethod

def _after(cls, own_attrs):

if ‘LOGIN_PATH’ not in own_attrs and ‘ROOT_PATH’ in own_attrs:

cls.LOGIN_PATH = cls.ROOT_PATH + ‘login’

if ‘ROOT_URL’ not in own_attrs and (‘SCHEME’ in own_attrs or ‘DOMAIN’ in own_attrs or ‘ROOT_PATH’ in

own_attrs):

cls.ROOT_URL = ‘%s://%s%s’ % (cls.SCHEME, cls.DOMAIN, cls.ROOT_PATH)

雖然問題是解決了,不過代碼量似乎大了點,寫起來很麻煩。只是似乎也沒有更好解決辦法,所幸這類配置並不多,所以重寫一次倒也無妨。

最後只剩下分離公開和私有配置這個需求了。

既然要有私有配置,很容易想到的就是把私有配置放在另一個倉庫里,再 link 到配置文件夾即可:

└── config

├── __init__.py

├── default.py

├── development.py – private/development.py

├── development_sample.py

├── private (cloned from another private repository)

│ ├── development.py

│ └── production.py

├── production.py – private/production.py

└── production_sample.py

為了避免文件被提交到公共倉庫,私有的配置文件可以加到 .gitignore 里。

順帶一提,我的博客數據全存放在 Redis 中,備份時只要備份 rdb 文件即可。不過用另一台服務器來備份顯得太奢侈了,所以我在服務器上裝了個 Dropbox,然後把 Dropbox 文件夾里的數據文件夾 link 到博客的數據文件夾里,即:

doodle

└── data

└── redis – ~/Dropbox/doodle/redis

這樣一旦文件有改動,Dropbox 就會自動進行備份,而且保留了所有的歷史版本,簡直完美。

如何進行python項目配置管理?這才是你最需要的python技術,我用於創建和管理虛擬環境的模塊稱為 venv。venv 通常會安裝你可用的最新版本的 Python。如果您的系統上有多個版本的 Python,你能處理好嗎?如果您還擔心自己入門不順利,那麼本科目的其他文章一定會幫助你。

怎樣在python中更新xml文件?

其實有兩種解析方式:

SAX(基於事件的解析方法,部分載入)

DOM(全部載入,內存消耗太多,改進方法:載入子樹,延遲讀)

python中可用,elementtree, minidom都是可以的

Python的mysql數據庫的更新如何實現

MySQL 的 Binlog 記錄著 MySQL 數據庫的所有變更信息,了解 Binlog 的結構可以幫助我們解析Binlog,甚至對 Binlog 進行一些修改,或者說是「篡改」,例如實現類似於 Oracle 的 flashback 的功能,恢復誤刪除的記錄,把 update 的記錄再還原回去等。本文將帶您探討一下這些神奇功能的實現,您會發現比您想像地要簡單得多。本文指的 Binlog 是 ROW 模式的 Binlog,這也是 MySQL 8 里的默認模式,STATEMENT 模式因為使用中有很多限制,現在用得越來越少了。

Binlog 由事件(event)組成,請注意是事件(event)不是事務(transaction),一個事務可以包含多個事件。事件描述對數據庫的修改內容。

現在我們已經了解了 Binlog 的結構,我們可以試着修改 Binlog 里的數據。例如前面舉例的 Binlog 刪除了一條記錄,我們可以試着把這條記錄恢復,Binlog 裏面有個刪除行(DELETE_ROWS_EVENT)的事件,就是這個事件刪除了記錄,這個事件和寫行(WRITE_ROWS_EVENT)的事件的數據結構是完全一樣的,只是刪除行事件的類型是 32,寫行事件的類型是 30,我們把對應的 Binlog 位置的 32 改成 30 即可把已經刪除的記錄再插入回去。從前面的 「show binlog events」 裏面可看到這個 DELETE_ROWS_EVENT 是從位置 378 開始的,這裡的位置就是 Binlog 文件的實際位置(以位元組為單位)。從事件(event)的結構裏面可以看到 type_code 是在 event 的第 5 個位元組,我們寫個 Python 小程序把把第383(378+5=383)位元組改成 30 即可。當然您也可以用二進制編輯工具來改。

找出 Binlog 中的大事務

由於 ROW 模式的 Binlog 是每一個變更都記錄一條日誌,因此一個簡單的 SQL,在 Binlog 里可能會產生一個巨無霸的事務,例如一個不帶 where 的 update 或 delete 語句,修改了全表裏面的所有記錄,每條記錄都在 Binlog 裏面記錄一次,結果是一個巨大的事務記錄。這樣的大事務經常是產生麻煩的根源。我的一個客戶有一次向我抱怨,一個 Binlog 前滾,滾了兩天也沒有動靜,我把那個 Binlog 解析了一下,發現裏面有個事務產生了 1.4G 的記錄,修改了 66 萬條記錄!下面是一個簡單的找出 Binlog 中大事務的 Python 小程序,我們知道用 mysqlbinlog 解析的 Binlog,每個事務都是以 BEGIN 開頭,以 COMMIT 結束。我們找出 BENGIN 前面的 「# at」 的位置,檢查 COMMIT 後面的 「# at」 位置,這兩個位置相減即可計算出這個事務的大小,下面是這個 Python 程序的例子。

切割 Binlog 中的大事務

對於大的事務,MySQL 會把它分解成多個事件(注意一個是事務 TRANSACTION,另一個是事件 EVENT),事件的大小由參數 binlog-row-event-max-size 決定,這個參數默認是 8K。因此我們可以把若干個事件切割成一個單獨的略小的事務

ROW 模式下,即使我們只更新了一條記錄的其中某個字段,也會記錄每個字段變更前後的值,這個行為是 binlog_row_image 參數控制的,這個參數有 3 個值,默認為 FULL,也就是記錄列的所有修改,即使字段沒有發生變更也會記錄。這樣我們就可以實現類似 Oracle 的 flashback 的功能,我個人估計 MySQL 未來的版本從可能會基於 Binlog 推出這樣的功能。

了解了 Binlog 的結構,再加上 Python 這把瑞士軍刀,我們還可以實現很多功能,例如我們可以統計哪個表被修改地最多?我們還可以把 Binlog 切割成一段一段的,然後再重組,可以靈活地進行 MySQL 數據庫的修改和遷移等工作。

centos怎麼更新python

不知道你是centos6及python版本,一下是centos6 2.6升級到2.7的方法,對應找到相應的版本就可以了。。

=======================================================

Centos系統一般默認就安裝有Python2.6.6版本,不少軟件需要2.7以上的,通過包管理工具安裝不了最新的版本,通過源碼編譯可以方便安裝指定版本,只需要把下面版本的數字換成你想要的版本號。

1.安裝步驟

下載源碼

wget

在下載目錄解壓源碼

tar -zxvf Python-2.7.12.tgz

進入解壓後的文件夾

cd Python-2.7.12

編譯前先在/usr/local建一個文件夾python2.7.12(作為python的安裝路徑,以免覆蓋老的版本,新舊版本可以共存的)

mkdir /usr/local/python2.7.12

編譯前需要安裝下面依賴,否則下面安裝pip就會出錯

yum install openssl openssl-devel zlib-devel gcc -y

安裝完依賴後執行下面命令

vim ./Modules/Setup

找到#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz去掉注釋並保存(即去掉井號)

在解壓縮後的目錄下編譯安裝

./configure –prefix=/usr/local/python2.7.12 –with-zlib

make

make install

此時沒有覆蓋老版本,再將原來/usr/bin/python鏈接改為別的名字

mv /usr/bin/python /usr/bin/python2.6.6

再建立新版本python的軟鏈接

ln -s /usr/local/python2.7.12/bin/python2.7 /usr/bin/python

這個時候輸入

python

就會顯示出python的新版本信息

Python 2.7.12 (default, Oct 13 2016, 03:17:14)

[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2

Type 「help」, 「copyright」, 「credits」 or 「license」 for more information.

2.修改yum配置文件

之所以要保留舊版本,因為yum依賴Python2.6,改下yum的配置文件,指定舊的Python版本就可以了。

vim /usr/bin/yum,將第一行的#!/usr/bin/python修改成#!/usr/bin/python2.6.6

3.安裝最新版本的pip

wget

python get-pip.py

找到pip2.7的路徑

find / -name “pip*”

上面的命令輸出

/root/.cache/pip

這裡省略一堆輸出

/usr/local/python2.7.12/bin/pip

/usr/local/python2.7.12/bin/pip2

/usr/local/python2.7.12/bin/pip2.7 #就是這個

/usr/bin/pip

/usr/bin/pip2

/usr/bin/pip2.6

為其創建軟鏈作為系統默認的啟動版本(之前有舊版本的話就先刪掉rm -rf /usr/bin/pip)

ln -s /usr/local/python2.7.12/bin/pip2.7 /usr/bin/pip

看下pip的版本

pip -V

pip 8.1.2 from /usr/local/python2.7.12/lib/python2.7/site-packages (python 2.7)

pip安裝完畢,現在可以用它下載安裝各種包了

python中四種配置文件

常用的配置文件後綴是.ini、.conf、.py,當然還有使用.json、.txt的,推薦使用常用的.ini、.py,配置文件的名字一般是config便於理解和使用。

ini配置文件,這類配置文件我們使用內置configparser庫來使用,它可以實現配置文件的寫入、更新、刪除、讀取等操作非常方便,建議使用這種方式。

新建一個config.ini的配置文件內容如下,編碼格式要是 utf-8 以免出錯。:

其中[]中的是section節點,該節點下的等式是option即鍵=值

然後每一行寫一個option ,每個選項就是一個option。直接寫名字,後面加 ” = ” 再加上它的值就行,字符串的表示不要加引號,否則引號也會被解析出來。

可以在配置文件中加入注釋 ,但是注釋必須是單獨的一行,且以 「#」 開頭。只是每次運行時不會讀入注釋,只要運行一次,寫入文件後,所有的注釋都會消失。

config.json文件

使用python內置的 json 標準庫進行解析ini文件。

load() 從json文件中讀取json格式數據

loads() 將字符串類型數據轉化為json格式數據

dump() 將json格式數據保存到文件

dumps() 將json格式數據保存為字符串類型

TOML的語法廣泛地由key = “value”、[節名]、#注釋構成。

支持以下數據類型:字符串、整形、浮點型、布爾型、日期時間、數組和圖表。

config.toml文件

使用外部庫 toml 解析toml文件。

安裝:pip install toml

讀取文件

安裝:

YAML是目前最推薦的配置文件格式。優秀的配置文件標準它幾乎都有:

容易閱讀和修改,支持注釋。

支持豐富的數據類型。

不同格式的明確表達。

yaml使用時需要注意:

yaml強制縮進。雖然不規定具體縮進幾個空格,但是同一級的內容要保持相同的縮進。

冒號後面一定要加空格, 否則無法解析。

python解析 yaml 可以使用pyyaml庫,操作和標準的文件操作非常類似:

得到的data就是解析後的數據,在python當中,它是一個嵌套的字典:

想獲取某一項配置,再通過字典的操作獲取:

config.yaml文件

讀取

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/237498.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:05
下一篇 2024-12-12 12:05

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29

發表回復

登錄後才能評論