2015-01-05 4 views
0

환경을 부트 스트랩하기위한 약간의 스크립트를 작성했지만 모듈 가져 오기 오류를 처리하려고 할 때 혼란에 처했습니다. 내 의도는 불행하게도 NameError로 인한 ImportError 의존성 설치

def install_yaml(): 
    print "Attempting to install python-yaml" 
    print "=============== Begining of Apt Output ===============" 
    if subprocess.call(["apt-get", "-y", "install", "python-yaml"]) != 0 : 
     print "Failure whilst installing python-yaml" 
     sys.exit(1) 
    print "================= End of Apt Output ==================" 
    #if all has gone to plan attempt to import yaml 
    import yaml 
    reload(yaml) 

try: 
    import yaml 
except ImportError: 
    print "Failure whilst importing yaml" 
    install_yaml() 

grains_config = {} 
grains_config['bootstrap version'] = __version__ 
grains_config['bootstrap time'] = "{0}".format(datetime.datetime.now()) 

with open("/tmp/doc.yaml", 'w+') as grains_file: 
    yaml.dump(grains_config, grains_file, default_flow_style=False) 

는 내가 나가서 설명하자면 NameError

Traceback (most recent call last): 
    File "importtest-fail.py", line 32, in <module> 
    yaml.dump(grains_config, grains_file, default_flow_style=False) 
NameError: name 'yaml' is not defined 
얻을 때 실행 ... YAML 모듈에 대한 가져 오기 오류를 잡을 다음 모듈을 설치 APT 사용하고, 다시 가져 그것을했다

약간의 연구 끝에 필자가 원하는 것처럼 들리지만 이전에 yaml 모듈에서 NameError를 사용하여 다시로드 한 builtin (이전에 가져온 모듈 다시로드)을 발견했습니다.

누구든지 가져 오기 예외를 처리하고 종속성을 설치하고 "다시 가져 오기"할 수있는 제안이 있습니까?

필자는 분명히 초기 종속성 설치를 수행하기 위해 일부 bash에서 파이썬 스크립트를 래핑 할 수 있지만 그다지 깨끗한 해결책은 아닙니다.

감사

+0

당신은'function'의 로컬 범위에서 이것을했습니다 – Kasramvd

답변

0

당신은 install_yaml()에서 지역yaml을 수입했다. 더 나은 여전히 ​​

global yaml 
기능 내부

, 또는 함수의에서 가져 오기 이동 오른쪽 install_yaml()를 호출 한 후 넣어 : 대신 글로벌로 표시해야 할 것이다.

개인적으로 나는 이 아니며 자동 설치 의존성이 방법입니다. 실패하고 관리자에게 종속성을 올바르게 설치하십시오. 예를 들어 패키지를 관리하기 위해 다른 수단 (예 : virtualenv)을 사용할 수도 있습니다.

+0

고맙습니다. 많은 의미가 있습니다. 나는 수입이 범위에 있다고 생각하지 않았습니다. 하지만 나는 스크립트의 시작 부분에 항상 가져 왔기 때문에 그렇게 생각합니다. 자동 설치가 아니라 귀하의 추론을 이해할 수 있습니다. 그러나이 경우 구성 관리 시스템을 부트 스트랩하여 향후 종속성을 관리하게됩니다. – Rasathus