코드 내에 파이썬 모듈 설치


310

스크립트 내에서 PyPi의 패키지를 직접 설치해야합니다. 어쩌면 일부 모듈 또는 거기에 distutils( distribute, pip나처럼 뭔가를 실행할 수 등) 기능 pypi.install('requests')및 요청 내 VIRTUALENV에 설치됩니다.


4
왜 자신의 패키지의 setup.py에서 관련 모듈을 종속성으로 정의하지 않습니까?
— Andreas Jung

5
알다시피 ... 실제로 실제로 수행되는 방식은 ...하지만 항상 os.system ( "pip install blah") 할 수는 있지만 sudo 액세스가 필요할 수도 있습니다 ... 설정에 의존하게하려면 더 나은 방법이 필요합니다. py
— Joran Beasley

2
여기에서 허용되는 답변을 변경 하시겠습니까? 가져 오기 pip좋은 아이디어 결코 - 그 내용 모두에 있다는 단순한 사실 _internal... 버전 10에서 시작
— 안티 Haapala

2
@chuwy stackoverflow.com/a/50255019/918959 <= 이것입니다. pip._internal가져올 수 있도록 설계되지 않았습니다. 다른 프로그램에서 가져올 때 절대적으로 임의의 작업을 수행 할 수 있습니다.
— Antti Haapala

3
@AnttiHaapala 좋아, 내가 바꿨어. 나는 개인적으로 두 솔루션을 모두 좋아하지 않지만 요즘 파이썬과는 거리가 멀기 때문에 귀하의 의견을 신뢰합니다.
— chuwy

답변:


253

스크립트에서 패키지를 설치하는 공식적으로 권장되는 방법은 하위 프로세스를 통해 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])

이것의 한 가지 문제는 Windows의 초보자 사용자에게는 python과 pip가 항상 PATH에 있지 않기 때문에 두 번 클릭 할 수있는 .py 파일은 매우 편리하지만 "pip install xxx"주석은 꽤 까다로운.
— jdpipe

CalledProcessError : 명령 '['C : \\ ProgramData \\ Anaconda3 \\ pythonw.exe ','-m ','pip ','install ','googleapiclient ']'가 0이 아닌 종료 상태 1을 리턴했습니다.
— parvij

383

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

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')

3
@nbro pip.main()명령 행에서와 같이 옵션을 전달 합니다 (단, 단일 문자열 대신 목록에서 각 옵션을 별도의 항목으로 사용). 그리고 원하는 패키지 버전을 지정하려면 명령 행에서와 동일하게하십시오. 예 :pip.main(['install', 'pip==7.1.0'])
— Kaos

3
설치에 실패한 경우를 처리하는 방법을 보여주는 stackoverflow.com/questions/6457794/… 도 참조하십시오 .
— P. Myer Nore

25
from pip._internal import main as pipmain당신은 사용할 수있는 pipmain()바로 사용되지 않는처럼 pip.main()참조 stackoverflow.com/questions/43398961/...
— Bjorks 번호 하나의 팬

17
지금은 더 이상 사용되지 않습니다.
— Morse

6
이유가 더 이상 사용되지 않으며 더 이상 권장되지 않습니다. pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program
— NBK

71

사용하고자하는 경우 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를 새로 고치는 방법을 참조하십시오 . 추가 정보가 필요합니다.


4
파이썬 3에서 어떻게 할 수 있습니까? imp.reload(site)나를 얻는다RuntimeError: dictionary changed size during iteration
— kgadek

패키지를 어디에 설치합니까 pip uninstall <package_name>? 이 작업을 수행 한 후에는 할 수 없었습니다 . 여전히 사용하여 제거 할 수는 pip.main있지만 패키지가 어디에 설치되어 있는지 알고 싶습니까?
— Ishan Khare

궁금했다. 내가하면 제대로 작동 pip install requests[security]합니까? 그것이 전역을 올바르게 정의하는지 확신하지 못했습니다.
— Fallenreaper

4
시대에 뒤쳐진. pip.main더 이상 작동하지 않습니다. pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program
— wim

23

이것은 작동해야합니다 :

import subprocess

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

1
예, 확실히 작동합니다. 그러나 나는 더 우아한 방법이 있다고 생각했습니다.) 조금 기다릴 것입니다.
— chuwy

1
@ Downvoter : 내 대답에 정확히 무엇이 잘못 되었습니까? 이 답변에는 모든 OP가 필요합니다. 심지어 쉘을 사용하지 않습니다.
— Quantum

13
경로에서 가장 먼저 나오는 올바른 pip 버전에 따라 다릅니다. 사용자가 대체 파이썬 설치를 실행하는 경우 pip는 현재 설치 대신 첫 번째 설치에 설치됩니다. 위의 가져 오기 방법이 올바른 위치에 설치됩니다. 나는 어쨌든 하락 투표에 반대하기 위해 투표했다.
— GaryBishop

6
스크립트 실행 방법에 따라 올바른 핍을 호출하지 않습니다.
— Natim

5
전화를 [sys.executable, '-m', 'pip', 'install', name]걸면 "올바른"핍을 얻을 수 있습니다.
— wim

12

@Aaron의 답변에 예외 처리를 추가했습니다.

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

1
하위 프로세스 및 PIP의 좋은 구현, 여기보다 더 나은 대부분의 솔루션
— 샨 그늘

3
retunr 값을 확인하지 않아 subprocess.call코드가 실패 할 수 있습니다.
— Antti Haapala

5

"install_requires"옵션을 사용하여 자신의 패키지의 setup.py 내에 종속 모듈을 정의하십시오.

패키지에 콘솔 스크립트를 생성해야 할 경우 "bin"폴더 (예 : virtualenv 환경)에 배치 될 래퍼 스크립트를 생성하기 위해 "console_scripts"진입 점을 사용할 수 있습니다.


1
이것이 정답이며 Python 프로젝트의 종속성을 관리 할 수있는 유일한 방법입니다. virtualenv, Fabric, buildout과 함께 작동하며 이름을 지정합니다. OP가 요구 한 것에 정확히 대답하지만 @xiaomao가 설명한 방법은 순수한 광기입니다.
— Lukas Graf

7
이것은 적절한 조언이지만, 질문에 대답하지 않습니다
— Corey Goldberg

2
패키징은 하나의 주제이지만 파이썬으로 작성된 배포 스크립트와 같은 다른 많은 사용 사례가 있습니다.
— hoefling
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.