Подтвердить что ты не робот

Остановить пип при сбое на одном пакете при установке с требованиями. Txt

Я устанавливаю пакеты из requirements.txt

pip install -r requirements.txt

Файл requirements.txt читает:

Pillow
lxml
cssselect
jieba
beautifulsoup
nltk

lxml - это единственный пакет, который не может быть установлен, и это приводит к тому, что все не удается (ожидаемые результаты, о которых говорят ларсы в комментариях). Однако после lxml сбой pip все еще проходит и загружает остальные пакеты.

Из того, что я понимаю, команда pip install -r requirements.txt не будет выполнена, если какой-либо из пакетов, перечисленных в requirements.txt, не будет установлен.

Есть ли какой-либо аргумент, который я могу передать при запуске pip install -r requirements.txt, чтобы сказать ему, чтобы установить, что он может, и пропустить пакеты, которые он не может, или выйти, как только он увидит что-то сбой?

4b9b3361

Ответ 1

Запуск каждой строки с помощью pip install может быть обходным путем.

cat requirements.txt | xargs -n 1 pip install

Примечание. Параметр -a недоступен в MacOS, поэтому старая кошка более портативна.

Ответ 2

Для 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)

версия в формате pip & lt; 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)

Ответ 3

Решение xargs работает, но может иметь проблемы с переносимостью (BSD/GNU) и/или быть громоздким, если у вас есть комментарии или пустые строки в файле требований.

Что касается usecase, где такое поведение потребуется, я использую, например, два отдельных файла требований, один из которых содержит только основные зависимости, которые должны быть всегда установлены, и другой файл с неосновными зависимостями, которые находятся в 90% случаев, которые не нужны для большинства случаев. Это будет эквивалент раздела Recommends пакета debian.

Я использую следующую оболочку script (требуется 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

Ответ 4

Это решение обрабатывает пустые строки, пустые строки, строки # комментариев, строки комментариев whitespace-then- # в твоем файле require.txt.

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

Шляпная подсказка к этому ответу за магию sed.

Ответ 5

Спасибо, Etienne Prothon для оконных шкафов.

Но после обновления до pip 18 пакет pip не становится доступным для публики. Поэтому вам может понадобиться изменить код следующим образом.

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

Ответ 6

Для 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. Скопируйте приведенный выше код и сохраните его как файл python в том же каталоге. Не забудьте использовать расширение .py, например, install_packages.py
  3. Запустите этот файл с помощью cmd: python install_packages.py
  4. Все упомянутые пакеты будут установлены сразу, без остановки. :)

Вы можете добавить другие параметры в функцию установки. Подобно:  main(['install'] + [str(package)] + ['--update'])

Ответ 7

У вас есть требования для использования lxml? Здесь они предназначены для установки:

sudo apt-get install libxml2-dev libxslt-dev python-dev

Если вы используете Windows или Mac, вы также можете это проверить. В качестве альтернативы, установка STATIC_DEPS = true будет автоматически загружать и строить обе библиотеки. (C)
http://lxml.de/installation.html