코드 내에 파이썬 모듈 설치


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.