문제

내 Django 앱 중 일부에서는 settings_local.py 파일을 사용하여 다양한 환경 (예 : 개발, 테스트 및 프로덕션)에서 다른 설정을 재정의합니다.원래 settings.py의 내용을 포함하도록 원래 다음 코드를 사용했습니다.

try:
    from settings_local import *
except ImportError:
    sys.stderr.write("The settings_local.py file is missing.\n")
    DEBUG=False
.

최근에 execfile 기능을 찾아서 다음과 같이 전환했습니다.

try:
    execfile(path.join(PROJECT_ROOT, "settings_local.py"))
except IOError:
    sys.stderr.write("The settings_local.py file is missing.\n"
    DEBUG=False
.

둘 다 의도 한대로 작동하지만, 저는 Gotchas가 누락되었는지, 일반적으로 접근 방식이 더 권장되는지 궁금합니다.

도움이 되었습니까?

해결책

execfile 기능을 사용하면 설정 파일이 평가 될 때마다 Python 소스 파일 (.py)의 평가가 발생합니다. 매번 파이썬 파서를 실행 중입니다. import를 사용하면 반드시이 작업을 수행하지 않을 수 있습니다 (.pyc 파일을 사용할 수 있음). 일반적으로 파이썬에서 프로젝트를 처음 실행하는 경우 (적어도 CPYTHON) 바이트 코드로 컴파일되어 다시 다시 컴파일되지 않습니다. 당신은 그걸 깨뜨리고 있습니다. 이것은 반드시 문제가 아니지만 당신은 그것을 알고 있어야합니다.

execfile를 사용하면 settings_local.py 파일의 모듈 범위에서 재 평가되는 settings.py 파일이 가질 수있는 모든 가져 오기가 발생합니다. import *를 사용하면 settings_local.py 모듈 범위에 모든 항목이 포함되어 있습니다. 순 효과는 동일합니다 (settings_local.py 모듈 범위에 포함 된 모든 항목은 settings.py에 포함되어 있음).

마지막으로 모듈이 모듈로 실행되는 것이 아니라 모듈로 실행되는 것이 정상입니다. os.path.dirname(__file__)와 같은 것을 포함하는 코드가 합리적입니다. 코드가이를 사용하는 경우 저자가 합리적으로 예상 할 수있는 모듈에서 코드가 더 이상 실행되지 않으므로 혼동이 될 것입니다.

내 경험에서 사람들은 importexecfile를 사용하지 않습니다. Django는 매우 많은 협약을 이룹니다. ' 협약을 따르십시오.

다른 팁

또 다른 차이 : execFile 컨텍스트 사전을 가져옵니다.기본적으로 기본적으로 글로벌 컨텍스트 지정된 사전.이것은 이상한 일을 허용 할 수 있습니다

dont_do_this.py :

# Probably not a good thing to do
z=x+1  # an expression that involves an un-defined field
.

분명히,

from dont_do_this import *
.

가 실패합니다.

그러나

d={'x':1}
execfile( 'dont_do_this.py', d )
.

는 OK이고 d=={'x':1, 'z':2}

의 결과

에 유의하십시오
x=1
execfile( 'dont_do_this.py' )
.

가 OK이며 변수 z가 전역에 추가되는 결과를 가져옵니다.

첫 번째 버전 (from settings_local import *)은 모두 가보고 기대할 수있는 것입니다.또한 코드 분석기가 모듈을 찾을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top