파이썬은 어떻게 자동으로 누락 된 라이브러리를 가져?

 

파이썬 프로젝트를 작성할 때, 우리는 종종 오류 가져 오기 모듈 오류가 발생할 수 있습니다 ImportError: No module named 'xxx'또는 ModuleNotFoundError: No module named 'xxx'.

일반적으로 두 가지로 나눌 가져 오기 실패, 하나는 자신의 (즉, 접미사 평 파일), 그리고 다른 하나는 수입 파티 라이브러리를 작성하는 모듈을 가져 오는 것입니다. 이 문서에서는 두 번째 경우에 초점을 맞추고있는 기회를 미래에, 우리는 세부 사항 기타 관련 주제에 대해 토론한다.

문제를 해결하는 데 실패 파이썬 라이브러리를 가져 오기, 사실, 키 (가상 환경 여부 주) 라이브러리를 누락 설치, 또는 적절한 대안을 사용하는 운영 환경에 있습니다. 문제는 세 가지 경우로 나누어 져 있습니다 :

하나의 누락 된 라이브러리 모듈

우리는하지만 확실히 그것을 설치하는 실제 운영 환경 (예 : 요청 등) 삼자 라이브러리를 사용해야하는 경우 코드의 준비에서, 당신은 할 수 있습니다 :

try:
    import requests
except ImportError:
    import os
    os.system('pip install requests')
    import requests

요청이 첫 번째 설치에 라이브러리를 찾아 수없는 경우 다음 가져, 그 효과를 썼다.

일부 오픈 소스 프로젝트, 우리는 또한 (예를 들어, JSON으로) 다음 줄을 볼 수 있습니다 :

try:
    import simplejson as json
except ImportError:
    import json

영향을 쓴, 우선 순위 삼자 가져 오기 라이브러리의 simplejson, 다음 사용하지 않는 경우 내장 된 표준 라이브러리 JSON.

이 글을 쓰는 이점이 추가 라이브러리를 가져올 필요는 없지만, 그것은 필요가 표준 라이브러리에는 다른 라이브러리, 그것은 가능하지 않는 경우 두 라이브러리의 사용, 호환되도록하는 단점이있다 .

당신이 정말로 호환 표준 라이브러리를 찾을 수없는 경우, 당신은 또한 당신이 원하는 것을 달성하기 위해 자신의 모듈 (예 : my_json.py 등), 쓰기, 다음 문을 제외하고 가져올 수 있습니다.

try:
    import simplejson as json
except ImportError:
    import my_json as json

둘째, 전체 프로젝트는 라이브러리 누락

위의 아이디어는 프로젝트의 개발,하지만 몇 가지 단점이 있습니다, 2, 노사정 표준 라이브러리 또는 라이브러리가 직접 할 수없는 일을, 각 삼자 라이브러리에 대한 코드 핍이 설치되어 누락 될 수 있습니다, 바람직하지 않다 필기 사서, 어떻게 할까? 3, 프로젝트가 형성되어, 이러한 수정은 어떻게 할 할 수 없습니다?

여기 질문은 그래서 : 새 컴퓨터에 배포하려는 프로젝트가,이 삼자 라이브러리를 많이 포함하지만,이 시스템에 사전 설치되어 있지 않은, 어떻게 할까?

프로젝트 준수의 경우, 계약에 따라, 그것은 일반적으로 "이 포함됩니다 requirements.txt "문서를 모든 프로젝트 종속성 및 버전 번호의 기록이 필요합니다. 이 프로젝트 릴리스하기 전에 명령이 사용입니다 pip freeze > requirements.txt생성합니다.

명령 사용 pip install -r requirements.txt(파일 디렉토리에 실행을하거나 명령 경로에 전체 파일을 쓰기), 자동으로 설치된 모든 종속 라이브러리를 제공 할 것입니다.

프로젝트가 준수 또는 다른 이유 나쁘게없는 경우에는, 우리는 그러한 문서가 없습니다, 당신은 어떻게해야합니까?

멍청한 방법이 잘못 될 수 있도록 프로젝트 및 실행, 대기를 넣어, 당신은 가이드 라이브러리가 수동으로로드 된 프로젝트가 발생 가이드 라이브러리를 설치하는 데 실패하면, 다시 실행, 등등 ... (1 생략 실패가 발생 만 나쁜 언어) ...

셋째, 자동 가져 오기 누락 된 라이브러리

더 나은 방법은 자동으로 실종 라이브러리를이 가져올 수 있나요?

"requirements.txt"파일이 필요없이, 원래의 코드를 수정하지 않고, 자동으로 라이브러리 필요 가져올 수있는 방법이 없다?

물론있다! 결과에서 첫번째보기 :

우리는, 예를 들어, 첫 번째 작업은 우리가 두 번째 수술 후, 수입은 다시 토네이도, 토네이도 설치되지 않은, 볼 수 토네이도, 프로그램은, 우리가 자동으로 다운로드 및 토네이도를 설치하는 데 도움이 오류없이 그렇게 할 것이다.

다음과 같이 자동 설치 우리의 손으로 모듈의 코드는 다음과 같습니다

# 以下代码在 python 3.6.1 版本验证通过
import sys
import os
from importlib import import_module


class AutoInstall():
    _loaded = set()

    @classmethod
    def find_spec(cls, name, path, target=None):
            if path is None and name not in cls._loaded:
                cls._loaded.add(name)
                print("Installing", name)
                try:
                    result = os.system('pip install {}'.format(name))
                    if result == 0:
                        return import_module(name)
                except Exception as e:
                    print("Failed", e)
            return None

sys.meta_path.append(AutoInstall)

이 코드에 사용되는 sys.meta_path이 무엇인지 확인하기 위해 첫 번째 인쇄?

파이썬 수입 메커니즘 (3)는 다음과 같은 순서로 실질적으로, 검색 과정에있다 :

  • 가져온 모든 모듈을 캐시하는 sys.modules에에서 찾기

  • 나중에 sys.meta_path에서 찾기, 그리고 사용자 정의 로더를 지원합니다

  • 디렉토리 곳 라이브러리의 이름의 일부를 기록하는의 sys.path에서 찾기

  • 찾을 수없는 경우, 던져 ImportError예외

언급 나중에 sys.meta_path 파이썬 2 및 Python 3 차이 대형 파이썬 다른 버전에서 변화되어야하는 상기 최신 버전 파이썬 3 (3.4 이상)에서 정의 로더 요구 구현 find_spec방법, 사용 된 초기 버전입니다 find_module.

자동 라이브러리 구성을 가져 오기 위의 코드는 AutoInstall을 클래스 로더 사용자 정의, 당신은 목적을 달성 할 수있다. 설명 할 필요가, 몇 가지 이상한 문제가 발생할 수 있으므로, 새로 수입 된 라이브러리를 "납치"원래 수입 방식을 파괴 할이 방법, 제발주의하십시오.

나중에 sys.meta_path 사용 파이썬 프로브에 속한다. 프로브, import hook모듈을 가져올 때, 자동적으로 지연로드로 누락 된 라이브러리, 업로드 감사 정보를 설치, 모듈이 수정 파이썬입니다 거의 눈에 띄지 만, 그러한 네트워크 라이브러리를로드하는 등의 많은 일을 할 수있는 등등.

공간 제한으로 인해, 우리는 더 이상 없다 구체적으로 배치합니다. 마지막 요약에 대한 :

  • 당신은 간단한 3 라이브러리 또는 수입 대체를 달성하는 방법을 제외하고 ... 시도 할 수 있습니다

  • 공지 종속성 전체 삭제 (예 requirements.txt)를 수동으로 설치하면

  • 나중에 sys.meta_path를 사용하면, 당신은 자동으로 삭제 라이브러리를 가져올 수 있습니다

추천

출처www.cnblogs.com/7758520lzy/p/12180361.html