Не встановлюйте збій піп-файлу в одному пакеті при установці з вимогами.txt


138

Я встановлюю пакети з 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надати під час запуску, щоб сказати йому встановити те, що він може, і пропустити пакунки, які він не може, або вийти, як тільки побачить щось не вдалося?


3
Видаліть lxml зі своїх
вимог.txt

1
Дякую, це спрацювало б у цьому випадку, але в цілому, чи існує спосіб цього? Або нормально просто запустити команду, побачити, що вона виходить з ладу, а потім обрізати список пакетів?
emh

5
Якщо пакет, включений до списку, requirements.txtвін, ймовірно, потрібен , то є сенс, що pipце не вдасться, якщо пакет не вдасться встановити. Якщо код все-таки працює без цього пакету, навряд чи це було вимогою. Випадково обрізання невдалих пакетів requirements.txtздається, що це просто спричинить проблеми з відсутніми залежностями.
larsks

1
@larsks дуже часто може бути декілька файлів вимог.txt для одного середовища розробки або пакета. Наприклад, може бути один повний додатковий інструмент, який можна використовувати для покращення тестового середовища блоку / інтеграції або профілювання продуктивності, але які не є строго необхідними. Ви все ще хочете керувати версією одного вихідного файлу, що виражає ці пакунки та будь-які закріплені версії, і покладатися на один і той же pip install -r <some file>робочий процес для стандартизації створення відповідного середовища.
ely

4
Зважаючи на це, здається, що глухий звук вважає, що піп не повинен підтримувати певний тип витонченої відмови / необов'язкової поведінки пропускання, яка друкує попередження, але встановлює, що може. Це дуже поширена потреба саме в цьому типі встановлення на основі протоколу з файлу вимог.
ely

Відповіді:


230

Запуск кожного рядка з pip installможе бути вирішенням.

cat requirements.txt | xargs -n 1 pip install

Примітка: -aпараметр недоступний під MacOS, тому стара кішка є більш портативною.


21
для mac: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видалити що-небудь із коментарів і позбутися порожніх рядків.
Нарек

1
Принаймні, у GNU xargsє -aопція прапора, яка дозволяє xargsчитати аргументи з файлу, тому це можна зробити як xargs -n 1 -a requirements.txt pip install. Запобігає UUOC та надмірній сантехніці
Сергій Колодяжний

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

Це рішення обробляє порожні рядки, рядки пробілів, # рядки коментарів, пробіли, потім - # рядки коментарів у ваших вимогах.txt.

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

Наконечник капелюха на цю відповідь для магії sed.


1
Працює чудово. Я використовував pip freezeзамість cat requirements.txt.
Вішал

5

Для Windows:

pip версія> = 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. Помилка.
Пранцелл

4

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

Що стосується футляра, де потрібна така поведінка, я використовую, наприклад, два окремі файли вимог, один, у якому перераховані лише основні залежності, які потрібно завжди встановлювати, та інший файл із непрофільними залежностями, які є в 90% випадків не потрібна для більшості випадків використання. Це було б еквівалентомRecommends розділу пакета debian.

Я використовую наступний скрипт оболонки (вимагає 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

Дякую, Етьєн Протон за вікна.

Але після оновлення до 18 pip пакет 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)

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.