2011-09-01 5 views
1

필자가 작성한 Python 라이브러리가 있습니다. 라이브러리의 작동 방식을 변경하는 변수 세트가 있습니다. 테스트 할 때 모두 정상적으로 작동했지만 변수 python lib.py install이 변수에 영향을주지 않습니다.라이브러리는 설치 여부에 따라 다르게 동작합니다.

도서관 :

##lib.py 
    config="Original" 

    def run(): 
     print config 

스크립트 : 스크립트와 같은 디렉토리에 라이브러리를 배치하고 실행하면

import lib 

    lib.config="New" 
    lib.run() 
    print lib.config 

가 출력이 나는 가능한 가장 간단한 예에이 고장 :

New 
    New 

그러나 라이브러리를 설치 한 다음 dis 라이브러리 t 패키지 출력은 다음과 같습니다.

Original 
    New 

누군가가 무슨 일이 일어나는지 설명 할 수 있습니까? 나는 약간의 혼란 스러움과 끔찍한 사건과 이유에 관심이있다. 또한 나는 완전히 잘못된 프로그래밍 구성을하고 있습니까?

편집

이 문제가 초기화 평 파일입니다 밝혀졌습니다. 기본적으로 다른 라이브러리를 가져 오는 라이브러리를 가져 오는 것과 같습니다. 설치된 모듈을 가져올 때 lib 폴더와 .py 파일을 봅니다. 초기화 .py는 단 하나의 라이너 from lib import *입니다. 단순히 실제 라이브러리 인 척하지만 전역 변수를 사용하면 이상한 문제가 발생합니다. 본질적으로 무슨 일이 일어나고 있는지의 시뮬레이션 예 :

##init.py 
from lib import * 

스크립트 :

import init 

init.config = 'New' 
init.run() 
print init.config 
출력

:

Original 
New 

함수 실행이() lib.py에서 config를 찾지 만 print init.config init.py에서 찾는다. 모두 도움을 주셔서 감사합니다. 수정은 모듈 설치 방법을 변경하는 것입니다 (초기화 .py). 결국 모든 전역 변수를 제거하기를 희망하지만 당분간 모든 것이 완벽하게 작동합니다.

+0

구성은 정적으로 수행해야하는 실제적인 이유가있는 경우가 아니면 일반적으로 개체 단위 인스턴스가 아닌 정적 (전역)이어야합니다. 그리고 그때조차도, 객체 인스턴스는 어떤 종류의 전역 설정을 무시하는 것을 지원해야합니다. – cdhowie

+1

또한이 문제는 Python 2.6.6에서 재현 할 수 없습니다. – cdhowie

+1

@trydyingtolive 설명하는 내용이 그럴듯 해 보이지 않습니다. –

답변

2

당신이 묘사 한 것은 파이썬이 어떻게 작동하는지 ("원한다면"나는 당신이 정확하게 그 결과를 얻었다 고 믿지 않습니다. "와) 일치하지 않을 것입니다.

다른 장소 또는 다른 방법으로 lib을 가져 오는 경우 모듈 중 하나의 사본 2 개 또는 현재 디렉토리 lib 중 하나와 두 개의 사본으로 끝날 수 있습니다. 설치된 lib. 인 경우 "원본"/ "새"동작이 발생합니다. 그럴 가능성이 가장 높습니다.

+0

나는 그 이유라고 생각했다. 그래서 두 라이브러리의 이름을 동일하게 지정하지 않았습니다. 또한 파이썬이 어떻게 작동하지 않는지 당신에게 동의합니다. 이것이 나에게 놀라운 이유입니다. – trydyingtolive

+0

@trydyingtolive : 그런 다음 그것을 지적하기 위해 'print lib'를 사용하고있는 곳에서 경로를 비교합니다. 동일한 경우 모듈 객체 ID를 비교하기 시작합니다. 'sys.modules'를 살펴보면 도움이 될 수도 있습니다. –

+0

내가보기에 가장 큰 차이점은 lib.pyc로 실행되는 동일한 디렉토리에서 실행하면 설치시 실행할 때 __init __에서 pyc를 실행한다는 것입니다. 모든 __init__은 import *입니다. – trydyingtolive

관련 문제