programing

코드 내에 Python 모듈을 설치하는 방법은 무엇입니까?

oldcodes 2023. 4. 14. 22:04
반응형

코드 내에 Python 모듈을 설치하는 방법은 무엇입니까?

PyPI에서 패키지를 스크립트에 직접 설치해야 합니다.

혹시 모듈이나distutils(distribute,pip, 등) 기능을 사용하면 다음과 같은 기능을 실행할 수 있습니다.pypi.install('requests')요청이 가상환경에 설치됩니까?

스크립트에서 패키지를 설치하는 공식 권장 방법은 하위 프로세스를 통해 pip 명령줄 인터페이스를 호출하는 것입니다.이 밖에 대부분의 답변은 pip에서 지원되지 않습니다.게다가 pip v10 이후, 모든 코드는pip._internal사용자에게 pip을 프로그래밍 방식으로 사용할 수 없다는 것을 명확히 하기 위해.

사용하다sys.executable같은 전화를 할 수 있도록 하기 위해pip현재 런타임에 관련되어 있습니다.

import subprocess
import sys

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

다음과 같은 것도 사용할 수 있습니다.

import pip

def install(package):
    if hasattr(pip, 'main'):
        pip.main(['install', package])
    else:
        pip._internal.main(['install', package])

# Example
if __name__ == '__main__':
    install('argh')

사용하고 싶은 경우pip필요한 패키지를 설치하고 설치 후 가져오려면 다음 코드를 사용할 수 있습니다.

def install_and_import(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        import pip
        pip.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)


install_and_import('transliterate')

패키지를 사용자로 설치한 경우 패키지를 가져올 수 없다는 문제가 발생할 수 있습니다.자세한 내용은 sys.path를 새로 고치는 방법을 참조하십시오.

이 조작은 유효합니다.

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])

나는 애런의 대답에 몇 가지 예외적인 처리를 추가했다.

import subprocess
import sys

try:
    import pandas as pd
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", 'pandas'])
finally:
    import pandas as pd

여러 패키지를 설치하려면setup.py다음 코드를 가진 파일:

import sys
import subprocess
import pkg_resources

required  = {'numpy', 'pandas', '<etc>'} 
installed = {pkg.key for pkg in pkg_resources.working_set}
missing   = required - installed

if missing:
    # implement pip as a subprocess:
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', *missing])

용도:

import os
os.system('pip install requests')

Docker 파일을 변경하지 않고 임시 해결을 위해 위와 같이 시도했습니다.

보다 효율적인 답변을 원하는 경우subprocess.check_call먼저 다음을 사용하여 요구 사항이 이미 충족되었는지 확인할 수 있습니다.pkg_resources.

이는 다양한 요건 지정자에 적합합니다.예.,>=,==:

import sys
import subprocess
import pkg_resources
from pkg_resources import DistributionNotFound, VersionConflict

def should_install_requirement(requirement):
    should_install = False
    try:
        pkg_resources.require(requirement)
    except (DistributionNotFound, VersionConflict):
        should_install = True
    return should_install


def install_packages(requirement_list):
    try:
        requirements = [
            requirement
            for requirement in requirement_list
            if should_install_requirement(requirement)
        ]
        if len(requirements) > 0:
            subprocess.check_call([sys.executable, "-m", "pip", "install", *requirements])
        else:
            print("Requirements already satisfied.")

    except Exception as e:
        print(e)

사용 예:

requirement_list = ['requests', 'httpx==0.18.2']
install_packages(requirement_list)

데모

관련 정보:스택 오버플로 질문: 58612272

"install_install" 옵션을 사용하여 자체 패키지의 setup.py 내에서 종속 모듈을 정의합니다.

패키지에 콘솔스크립트가 생성되어야 하는 경우 "console_scripts" 엔트리 포인트를 사용하여 "bin" 폴더 내에 배치되는 래퍼 스크립트를 생성할 수 있습니다(virtualenv 환경의 경우 등).

정확한 버전의 여러 패키지를 조건부설치하기 위해 @Tanmay Shrivastava의 답변을 바탕으로 다음 패턴을 사용하고 있습니다.

import sys
from subprocess import run, PIPE, STDOUT
import pkg_resources

def run_cmd(cmd):
    ps = run(cmd, stdout=PIPE, stderr=STDOUT, shell=True, text=True)
    print(ps.stdout)


# packages to be conditionally installed with exact version
required = {"click==8.0.1", "semver==3.0.0.dev2"}
installed = {f"{pkg.key}=={pkg.version}" for pkg in pkg_resources.working_set}
missing = required - installed

if missing:
    run_cmd(f'pip install --ignore-installed {" ".join([*missing])}')
    import pip

try:
    import imaplib
    import email
    import pandas as pd
    # for hiding password
    from pathlib import Path
    from dotenv import load_dotenv
    import os
    import requests
    # 
    from collections import defaultdict
    from itertools import permutations,combinations
except Exception as e:
    print(e)
    e = str(e).split(' ')[-1].replace("'","")
    pip.main(['install', e])

아래를 시험해 보세요.지금까지는 그게 제일 잘 먹혔어요.

먼저 4개를 설치한 "필수" 목록에 새 것을 언급합니다.

import pkg_resources
import subprocess
import sys
import os

REQUIRED = {
  'spacy', 'scikit-learn', 'numpy', 'pandas', 'torch',
  'pyfunctional', 'textblob', 'seaborn', 'matplotlib'
}

installed = {pkg.key for pkg in pkg_resources.working_set}
missing = REQUIRED - installed

if missing:
    python = sys.executable
    subprocess.check_call([python, '-m', 'pip', 'install', *missing], stdout=subprocess.DEVNULL)

언급URL : https://stackoverflow.com/questions/12332975/how-can-i-install-a-python-module-within-code

반응형