本文目錄一覽:
如何進行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安裝怎麼配置環境變數
安裝python,如我安裝目錄為C:\Python27
打開環境變數:右鍵計算機-屬性
進入高級,環境變數
找到系統變數中的path,雙擊編輯之,將python的安裝目錄加入到最後(與前一個路徑用;隔開)
確定,確定,ok
3. 驗證
進入cmd,輸入python效果如下
怎樣配置Python環境變數
第一步:
找到你的python安裝的目錄
比如我的安裝在D盤的python 2.7文件夾下面,我就找到這個文件夾。
然後複製這個文件地址
CTRL+C複製。
第二步:
打開環境變數設置
首先打開控制面板
win10系統找不到控制面板的話,直接用小娜搜索。
打開控制面板
點擊系統選項
點開之後,在左邊的選項找到高級系統設置
之後選擇高級,就可以看到環境變數設置選項了
點擊環境變數
就可以看到他的編輯界面了,然後單擊Path,再點擊編輯。
然後就可以進到編輯界面了,之後點擊新建
他會新建一個path環境變數文本
然後在這裡輸入你剛剛複製的python目錄就好了,比如我的是D:\Python 2.7,那我就輸入D:\Python 2.7,如下圖
如果剛剛你已經複製了的話可以直接CTRL+V粘貼,然後回車
到這裡,你的python環境變數就已經設置好了,之後確定,確定,確定。。就是一路確定。。
然後Win+R輸入cmd回車
進入命令提示符
之後輸入python
回車,如果成功啟動,那麼說明python的環境變數已經編輯好了,之後盡情使用python吧
win10怎麼配置python環境變數
安裝之後配置環境變數的步驟如下:
1,點「我的電腦」,右鍵選「屬性」。
2,選擇「高級系統設置」—選「環境變數」—在「系統變數」中選中「Path」,再點「編輯」—再點「編輯文本」。
3,在「變數值」一欄,把自己所安裝的python路徑拷進去就可以了,我安裝的路徑是「C:\Python27」。
4.完成之後,一路點擊確定關閉,就ok了。
5.這裡要強調一下,現在下載的python都自帶pip,pip在python目錄下的Scripts目錄下,添加到系統的path路徑中就可以使用了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/207144.html