[英]Python module variable interdependency
我正在嘗試創建一個模塊來保存Fabric文件的配置。 此配置文件將包含與項目相關的設置,因此我可以對所有項目使用相同的fabfile。
我希望fabfile看起來像這樣:
import config
from fabric.api import local
def deploy(env='staging'):
config.env = env
local("xcopy {project_dir} {deploy_target} /u /r /y".format(project_dir=config.project_dir,
deploy_target=config.deploy_target))
#Ok, this will be more involved than that, but it is enough to explain my problem
和配置文件如下所示:
env = 'staging'
project_dir = r'c:\some\unimportant\path'
deploy_target = r'c:\some\target\path\based\on\{env}'.format(env=env)
因此,我可以使用: fab deploy
或fab deploy:staging
部署到過渡環境,而fab deploy:production
部署到生產環境。
我要弄清楚的是,當env變量更改時,如何更新模塊中的變量。
我希望我的配置文件盡可能簡單,理想情況下只是變量分配,但如果確實需要,我可以使用一些功能。 設置文件中會有很多變量,因此使用global關鍵字更新函數中的值看起來非常難看。
將配置參數存儲在字典中。
因此,在具有__init__.py
文件的目錄中,有一個名為my_config.py
的文件(請注意,該文件必須在您的python_path中),其內容類似於:
my_params = {'env': 'staging',
'project_dir': r'c:\some\unimportant\path',
'deploy_target': r'c:\some\target\path\based\on\staging',
}
我不確定您如何計划將配置設置傳遞到fabfile,但是在配置文件中包含字典之后,訪問設置非常簡單。 如果您具有在單個字典中定義的單個項目的所有配置設置(如上所述),則可以在fabfile中輸入以下內容:
config = __import__('my_config')
此時,您可以通過以下方式訪問配置設置:
env = config.my_params['env']
同樣,我不確定您打算如何傳遞所需的配置,因此,如果我錯過了標記,請發表評論。 無論如何,字典是存儲此類信息的pythonic方法,並且在需要時可以輕松導入這些值。
我認為,每當您更改config.env
, config.env
config
模塊中的變量得到更新,則需要至少使用一個函數。
最簡單的方法可能是將env
作為變量刪除,而是創建setEnv
函數(該函數將所有其他模塊變量設置為適當的值)。 另一個選擇是保留env
be,但是調用函數以獲取其他值(例如config.get_deploy_target()
)。
甚至有可能使模塊看起來僅包含值,而實際上其中的某些或全部是基於env
或其他值即時計算的。 這需要使用Python模塊查找系統做一些技巧,以便您實際上是從類實例而不是實際模塊中讀取值。 這使得使用config
模塊的代碼很簡單,但是config.py
本身更加復雜:
# config.py
class Config(object):
def __init__(self):
self.env = "staging"
self.project_dir = r'c:\some\unimportant\path'
@property
def deploy_target(self):
return r'c:\some\target\path\based\on\{env}'.format(env=self.env)
import sys
sys.modules["config"] = Config()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.