2012-05-01 2 views
1

파이썬 애플리케이션에서 설정을 자동으로 설정하는 방법에 대해 생각 해왔습니다.git 브랜치를 기반으로 파이썬 애플리케이션을 설정하십시오.

나는 일반적으로 접근 할 경우 다음과 같은 종류의 사용 :이처럼 작동 좋아

from config import Development, Production 

do_something(): 
    if self.conf.DEBUG: 
     pass 

def __init__(self, config='Development'): 
    if config == "production": 
     self.conf = Production 
    else: 
     self.conf = Development 

: 일반적으로

'''config.py''' 
class Config(object): 
    MAGIC_NUMBER = 44 
    DEBUG = True 

class Development(Config): 
    LOG_LEVEL = 'DEBUG' 

class Production(Config): 
    DEBUG = False 
    REPORT_EMAIL_TO = ["[email protected]", "[email protected]"] 

를, 내가 뭔가를 할 수있는 여러 가지 방법으로 응용 프로그램을 실행하고있을 때 그것은 의미가 있기 때문에, 그러나 어떻게 든 내 자식 작업 흐름에 너무 통합 할 수 있는지 궁금 해서요.

많은 응용 프로그램에는 별도의 스크립트 또는 단독으로 실행할 수있는 모듈이 있기 때문에 일부 루트 위치에서 구성을 상속하는 모 놀리 식 응용 프로그램이 항상있는 것은 아닙니다.

이 스크립트와 별도의 모듈의 많은 같은 공유하는 config.py에서 클래스를 찾아, 현재 체크 아웃 어떤 지점 확인하고 예를 들어, 그에 따라 자신의 기본 구성 결정을 할 수 있다면 그것은 멋진 것 name은 현재 체크 아웃 된 브랜치의 이름입니다.

그게 가능하고 그것을 달성하는 가장 깨끗한 방법은 무엇입니까?

좋은 생각인가요 나쁜 생각입니까?

import inspect, subprocess, sys 

def __init__(self, config='via_git'): 
    if config == 'via_git': 
     gitsays = subprocess.check_output(['git', 'symbolic-ref', 'HEAD']) 
     cbranch = gitsays.rstrip('\n').replace('refs/heads/', '', 1) 
     # now you know which branch you're on... 
     tbranch = cbranch.title() # foo -> Foo, for class name conventions 
     classes = dict(inspect.getmembers(sys.modules[__name__], inspect.isclass) 
     if tbranch in classes: 
      print 'automatically using', tbranch 
      self.conf = classes[tbranch] 
     else: 
      print 'on branch', cbranch, 'so falling back to Production' 
      self.conf = Production 
    elif config == 'production': 
     self.conf = Production 
    else: 
     self.conf = Development 

이는, 음, "약간 시험"입니다 (파이썬 2.7) :

+0

모든 분기마다 다른 config.py를 사용하지 않는 이유는 무엇입니까? 그렇게하면 코드에서 설정을 가져 오기 만하면 VCS (이 경우에는 git)가 설정 파일의 모든 분기를 처리하도록 할 수 있습니다. – spinlok

답변

1

나는 spinlok의 방법을 선호 싶지만, 그래, 당신은, 당신의 __init__에 예를 당신이 원하는 거의 아무것도 할 수 있습니다 . git가 심볼릭 참조를 얻을 수 없다면 check_output은 예외를 발생시킬 것이고 이것은 또한 작업 디렉토리에 달려 있다는 것을주의하십시오. 물론 subprocess 다른 기능을 사용할 수도 있습니다 (예 : cwd).

관련 문제