2012-11-07 4 views
3

* .py 파일을 사용하여 Python 응용 프로그램에서 여러 가져 오기에서 변수를 가져오고 장고 설정 파일의 작동 방식과 비슷하게 사용하려고합니다. Django 설정 파일과 비슷한 Python 가져 오기

예제 설정 파일 :

DB_NAME = 'foo' 
DB_TABLE = 'bar' 
#Lots of other variable names and values here 

장점은 내가 매우 신속하게이 방법을 다른 설정을로드 할 수 있다는 것입니다. 처리 할 특정 객체가 없어도 원하는 모든 종류의 전역 "DB_NAME"을 참조 할 수 있습니다.

단점은 가져 오기 명령문을 가져 오는 모든 파일에서 변경해야한다는 것입니다.

파일을 한 번 가져온 다음 일반 가져 오기를 참조하여이 값을 모두 가져올 수 있도록 설정할 수 있습니까?

아니면 더 좋은 방법이 있습니까?

도움을 주시면 감사하겠습니다.

EDIT :이 문제는 여러 설정 파일을 가지고 있기 때문에 발생합니다. 하나의 파일에 대해 settings.py를 가져 오거나 다른 설정 파일을 원한다면 test_settings.py 등을 참조하기 위해 모든 import 문을 변경해야합니다.

수동으로 싶지 않습니다. 가져 오기 위치를 변경하여 전체 응용 프로그램에서 가져온 내용을 변경하십시오.

+2

나는이 질문을 이해하고 있는지 잘 모르겠다. 각 파이썬 모듈은 단지 네임 스페이스 일뿐입니다. mypacakge/settings.py와 같은 것을 쓰고 있다면'from. 설정 가져 오기 '를 선택하고'settings.DB_NAME' 등의 옵션에 액세스하십시오. – Iguananaut

+0

답변을 이해할 수 있는지 잘 모르겠습니다. 나는 내 질문을 업데이트했다. 더 합리적인 지 알려주세요. – metalcharms

답변

4

폴더에

settings = {} 
settings['server'] = '172.16.150.106:1433' 
settings['user'] = 'pyadmin' 
settings['password'] = 'admin' 
settings['db'] = 'SQLSERV_2005' 

열린 쉘 (ipython)

In [1]: from config import settings 

In [2]: print settings 
{'password': 'admin', 'db': 'SQLSERV_2005', 'user': 'pyadmin', 'server': '172.16.150.106:1433'} 

이 __init__.py 파일을 잊지 말고 우리 자신의 config.py 파일을 만듭니다!

파일 a.py :

#!/usr/bin/env python 
import __builtin__ 
import b 

if __name__ == "__main__": 
    import conf 
    __builtin__.__dict__["CONF"] = conf 

    print "IN A: %s" % CONF.VAR 

    b.test_conf() 

파일 b.py :

def test_conf(): 
    print "IN B: %s" % CONF.VAR 

파일의 conf 당신은 모듈 __builtin__을 사용할 수 있습니다

+0

감사! 이것은 내가 원하는 것입니다! – metalcharms

1

기본적으로 전역 적으로 사용 가능한 모듈을 원합니다.

Python module search path docs에 나와있는 것처럼 몇 가지 방법이 있습니다. 본질적으로 글로벌 모듈을 sys.path 검색 경로 아래에 배치 할 수 있다면 사용자 환경의 컴퓨터에서 어디서든 액세스 할 수 있습니다. (wsgi 서버에 대해서도 sys.path에 모듈을 추가 할 수 있습니다.)

.bashrc 파일을 통해 PYTHONPATH 환경 변수에 모듈을 추가합니다. 예 :

PYTHONPATH=~/projects/pyutil/:$PYTHONPATH 

또한 모듈을 가져 오기 전에 수입이 수행하기 전에 sys.path에 추가하여 파이썬 프로그램의 검색 경로에 추가 할 수 있습니다.

2

.평 :

VAR = "VAL"

그래서 기본적으로 한 번 DICT를 내장에 설치에 요소를 필요로하고 이름으로 다른로드 된 모듈에 액세스 할 수 있습니다.

try: 
    import test_settings as settings 
except ImportError: 
    import default_settings as settings 

참고 그렇게하지 : 문제는 여러 설정을 가진 유래

+0

당신이 아주 좋은 이유가 없다면 그렇게하지 마십시오. 그런 식으로 광기가 있습니다. – Iguananaut

+0

신중하게 사용하면 it'is 완벽하게 합법적이고 문제를 해결할 수 있습니다. –

1

여러 모듈의 별명을 할 수있게하려면이 솔루션의 몇 가지있다 파일 모듈의 존재/부재를 사용해야하는 경우, 원하는 흐름 제어를 사용하여 오른쪽 import 문을 선택할 수 있습니다. 제안

또한, PYTHONPATH은/다른 설정을 목표로 사용해야 수 있습니다 : 마지막으로,이 진정으로 재현 솔루션을 만들기 위해 distutils을 고려

# code just does "import settings" and there's a settings.py in each /opt/{test,default}_settings 
    PYTHONPATH=/opt/test_settings ./my_app 
    PYTHONPATH=/opt/default_settings ./my_app 

와 - 다른 배포판과 다른 설정을 배포하는 동일한 패키지 이름을 제공하십시오.

+0

답변 해 주셔서 감사합니다. 나는 "당신이 올바른 import 문을 선택하기 위해 어떤 흐름 제어를 사용하는 것"을 의미하는지 이해하지 못한다. 모든 설정 파일이 디렉토리에 존재한다면 항상 처음 나열된 기본값으로 설정하지 않습니까? – metalcharms

+0

'try :'/'except :'예제는'test_settings.py'라는 파일을 먼저 찾고,없는 경우'default_settings.py'를 찾습니다. 하지만 if is_monday : import test_settings를 설정으로 사용할 수 있습니다. else : 설정으로 default_settings 가져 오기 ' –

+0

알았습니다. 지금 받으십시오. 감사! – metalcharms

관련 문제