2013-02-12 2 views
0

가변 범위에 대한 noob python 질문이 있습니다.python : 가져온 파일에서 가변적 인 사용 가능

두 개의 스크립트를 만들었습니다. 하나는 다른에 포함되어

file1.py

a = 10 
from file2 import * 

file2.py

print a 

내가 file1.py를 실행하려고, 난이 오류가 발생합니다 : NameError : 'a'이름이 정의되어 있지 않습니다.

그래서, 이것이 제 질문입니다. 포함 된 스크립트에서 스크립트의 변수를 사용할 수 있습니까?

UPDATE : main.py 내가 유틸에서

filename = "/tmp/file.txt" 

이있을 것이다

config.py에서
from config include * 
from utils include * 

: 내가 실제로 할 노력하고있어 것은이 같은 것입니다 .py 나 가질거야

def write_file(): 

문제는 내가 파일 이름이 필요한 모든 작은 함수들을 가지고 있다는 것이다. 지금 나는 utils.py에서 그 기능을 가지고 있지 않습니다. 나는 그들을 main.py에 가지고있다. 그러나 시간이 지남에 따라 main.py가 점점 더 커지면서 유틸리티 스크립트를 메인 스크립트에서 옮기는 쉬운 방법이 있는지 생각 중입니다.

+0

여기에 질문이 있습니다. 가능한 경우 여러 모듈에서 동일한 모듈을 가져 오면 예상되는 동작은 무엇입니까? – bereal

답변

1

두 번째 파일의 print a은 첫 번째 파일이 아닌 해당 범위에서 실행됩니다. 파이썬 모듈은 C 헤더 파일과 같지 않습니다. 코드가 파일에 '포함'되어 있지 않습니다. 모듈이로드되고 코드가 실행되므로 해당 모듈의 이름에 액세스 할 수 있습니다.

이것은 모듈에서 흔히 발견되는 if __name__ == '__main__': 블록의 좋은 예입니다. 이 코드가 실제로 스크립트에 임베드 된 경우 블록 내 코드는 항상 __name__'__main__' 일 때마다 실행됩니다. 그러나 모든 코드가 가져온 모듈의 범위 내에서 실행되기 때문에 __name__은 다른 값이되므로 최상위 스크립트에있는 경우에만 코드가 실행됩니다.

print a을 성공적으로 수행하려면 두 번째 파일에 from file1 import a이 필요합니다.

업데이트 문제를 해결하려면 문제가되지 않습니다. 의 utils 스크립트는 filename이 참조되기 전에 가져 오기되는 한 변수를 사용할 수 있습니다.

0

업데이트에서 config.py의 구성을 원한다고 가정합니다. 문제를 해결하는 가장 좋은 방법은 매개 변수로 파일 이름을 utils.py 메소드로 보내는 것입니다.

def write_file(filename) 

가변 filename에 따라

def write_file() 

이 범위에있을 것을 더 유용한 유틸리티 함수! IMHO 그것도 좋은 프로그래밍 실습 (암시적인 것보다 명백하게 선호 하는가?).

관련 문제