requirements.txt로 설치할 때 단일 패키지에서 pip가 실패하지 않도록 중지


138

패키지를 설치하고 있습니다 requirements.txt

pip install -r requirements.txt

requirements.txt파일을 읽습니다

Pillow
lxml
cssselect
jieba
beautifulsoup
nltk

lxml설치에 실패한 유일한 패키지이므로 모든 것이 실패합니다 (주석에서 larsk가 지적한 예상 결과). 그러나 lxml실패 pip후에도 계속해서 나머지 패키지를 다운로드합니다.

내가 이해 한 바에 pip install -r requirements.txt나열된 패키지 중 하나라도 설치에 실패하면 명령이 실패합니다 requirements.txt.

실행할 pip install -r requirements.txt수있는 것을 설치하고 할 수없는 패키지를 건너 뛰거나 무언가 실패한 것을 끝내기 위해 종료하도록 실행할 때 전달할 수있는 인수 가 있습니까?


3
requirements.txt에서 lxml 제거
RickyA

1
고마워,이 경우에는 효과가 있지만 일반적 으로이 문제를 해결할 방법이 있습니까? 아니면 명령을 실행하는 것이 정상입니까, 명령이 실패한 것을 확인한 다음 패키지 목록을 제거하십시오.
emh

5
패키지가 나열된 경우 requirements.txt아마도 필수 패키지 이므로 pip패키지를 설치할 수 없으면 실패 하는 것이 좋습니다. 코드가 패키지없이 실행되는 경우에는 거의 필요하지 않습니다. 실패한 패키지를 임의로 정리 requirements.txt하면 종속성이 누락되는 문제가 발생하는 것처럼 보입니다.
Larsks

1
@larsks 단일 개발 환경 또는 패키지에 대해 여러 requirements.txt 파일을 갖는 것이 매우 일반적 일 수 있습니다. 예를 들어, 단위 / 통합 테스트 환경 또는 성능 프로파일 링을 향상시키는 데 사용할 수 있지만 꼭 필요한 것은 아닙니다. 여전히 이러한 패키지와 고정 된 버전을 나타내는 단일 소스 파일의 버전을 제어하고 동일한 pip install -r <some file>워크 플로를 사용하여 적절한 환경 만들기를 표준화합니다.
ely

4
이를 감안할 때 pip가 경고를 인쇄하지만 가능한 기능을 설치하는 일부 유형의 정상적 실패 / 선택적 건너 뛰기 동작을 지원해서는 안된다고 제안하는 것은 매우 귀찮은 것 같습니다. 이는 요구 사항 파일에서 정확히이 유형의 pip 기반 설치에 대한 매우 일반적인 요구입니다.
ely

답변:


230

각 줄을 실행 pip install하면 해결 방법이 될 수 있습니다.

cat requirements.txt | xargs -n 1 pip install

참고 : -aMacOS에서는 매개 변수를 사용할 수 없으므로 오래된 고양이가 더 휴대하기 편리합니다.


21
맥의 경우 :cat requirements.txt | xargs -n 1 pip install
Walty Yeung

5
: 내가해야 할 일을했을 cat requirements.txt | cut -f1 -d"#" | sed '/^\s*$/d' | xargs -n 1 pip install코멘트에 아무것도를 제거하고 빈 줄 없애.
Narek

1
적어도 GNU xargs에는 -a플래그 옵션 xargs이있어 파일에서 인수를 읽을 수 있으므로 다음과 같이 수행 할 수 있습니다 xargs -n 1 -a requirements.txt pip install. UUOC 및 과도한 배관 방지
Sergiy Kolodyazhnyy

7
Windows의 경우 :)FOR /F %k in (requirements.txt) DO pip install %k
wcyn

심지어없이 -a플래그, 고려 < requirements.txt xargs -n 1 pip install전면에서 리디렉션 마음에 들지 않으면, 또는 xargs -n 1 pip install < requirements.txt. :-)
torek

10

이 솔루션은 requirements.txt에서 빈 줄, 공백 줄, # 주석 줄, 공백 -then- # 주석 줄을 처리합니다.

cat requirements.txt | sed -e '/^\s*#.*$/d' -e '/^\s*$/d' | xargs -n 1 pip install

sed 마술에 대한 이 답변의 모자 팁 .


1
잘 작동합니다. pip freeze대신에 사용 했습니다 cat requirements.txt.
Vishal

5

Windows의 경우 :

핍 버전> = 18

import sys
from pip._internal import main as pip_main

def install(package):
    pip_main(['install', package])

if __name__ == '__main__':
    with open(sys.argv[1]) as f:
        for line in f:
            install(line)

핍 버전 <18

import sys
import pip

def install(package):
    pip.main(['install', package])

if __name__ == '__main__':
    with open(sys.argv[1]) as f:
        for line in f:
            install(line)

'main'은 pip의 일부가 아닙니다. 오류.
Pranzell

4

xargs당신이 당신의 요구 사항 파일에 주석이나 빈 줄이있는 경우 솔루션 작품은 성가신을 이식성 문제 (BSD / GNU)가 및 / 또는 수 있지만.

이러한 동작이 필요한 유스 케이스의 경우, 예를 들어 항상 설치해야하는 핵심 종속성 만 나열하는 두 개의 별도 요구 사항 파일과 사례의 90 %에 해당하는 비 핵심 종속성이있는 다른 파일을 사용합니다. 대부분의 사용 사례에는 필요하지 않습니다. 그것은 Recommends데비안 꾸러미 의 섹션과 같습니다 .

다음 쉘 스크립트 (필수 sed)를 사용하여 선택적 종속성 을 설치합니다 .

#!/bin/sh

while read dependency; do
    dependency_stripped="$(echo "${dependency}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
    # Skip comments
    if [[ $dependency_stripped == \#* ]]; then
        continue
    # Skip blank lines
    elif [ -z "$dependency_stripped" ]; then
        continue
    else
        if pip install "$dependency_stripped"; then
            echo "$dependency_stripped is installed"
        else
            echo "Could not install $dependency_stripped, skipping"
        fi
    fi
done < recommends.txt

0

Windows 사례에 대해 Etienne Prothon에게 감사드립니다.

그러나 pip 18로 업그레이드 한 후 pip 패키지는 main을 공개하지 않습니다. 따라서 이와 같은 코드를 변경해야 할 수도 있습니다.

 # This code install line by line a list of pip package 
 import sys
 from pip._internal import main as pip_main

 def install(package):
    pip_main(['install', package])

 if __name__ == '__main__':
    with open(sys.argv[1]) as f:
        for line in f:
            install(line)

-1

Windows의 경우 :

import os
from pip.__main__ import _main as main

error_log = open('error_log.txt', 'w')

def install(package):
    try:
        main(['install'] + [str(package)])
    except Exception as e:
        error_log.write(str(e))

if __name__ == '__main__':
    f = open('requirements1.txt', 'r')
    for line in f:
        install(line)
    f.close()
    error_log.close()
  1. 로컬 디렉토리를 작성하고 requirements.txt파일을 넣으십시오 .
  2. 위의 코드를 복사하여 동일한 디렉토리에 파이썬 파일로 저장하십시오. .py예를 들어 확장 프로그램 을 사용해야 합니다.install_packages.py
  3. cmd를 사용하여이 파일을 실행하십시오. python install_packages.py
  4. 언급 된 모든 패키지는 전혀 멈추지 않고 한 번에 설치됩니다. :)

설치 기능에서 다른 매개 변수를 추가 할 수 있습니다. 처럼: main(['install'] + [str(package)] + ['--update'])

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.