本文目錄一覽:
- 1、如何進行python項目配置管理?這才是你最需要的python技術
- 2、怎樣在python中更新xml文件?
- 3、Python的mysql數據庫的更新如何實現
- 4、centos怎麼更新python
- 5、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