Ответ 1
Запуск каждой строки с помощью pip install
может быть обходным путем.
cat requirements.txt | xargs -n 1 pip install
Примечание. Параметр -a
недоступен в MacOS, поэтому старая кошка более портативна.
Я устанавливаю пакеты из 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
, чтобы сказать ему, чтобы установить, что он может, и пропустить пакеты, которые он не может, или выйти, как только он увидит что-то сбой?
Запуск каждой строки с помощью pip install
может быть обходным путем.
cat requirements.txt | xargs -n 1 pip install
Примечание. Параметр -a
недоступен в MacOS, поэтому старая кошка более портативна.
Для Windows:
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)
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)
Решение 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
Это решение обрабатывает пустые строки, пустые строки, строки # комментариев, строки комментариев whitespace-then- # в твоем файле require.txt.
cat requirements.txt | sed -e '/^\s*#.*$/d' -e '/^\s*$/d' | xargs -n 1 pip install
Шляпная подсказка к этому ответу за магию sed.
Спасибо, 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)
Для 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()
requirements.txt
..py
, например, install_packages.py
python install_packages.py
Вы можете добавить другие параметры в функцию установки. Подобно:
main(['install'] + [str(package)] + ['--update'])
У вас есть требования для использования lxml? Здесь они предназначены для установки:
sudo apt-get install libxml2-dev libxslt-dev python-dev
Если вы используете Windows или Mac, вы также можете это проверить.
В качестве альтернативы, установка STATIC_DEPS = true будет автоматически загружать и строить обе библиотеки. (C)
http://lxml.de/installation.html