requirements.txtを使用してインストールするときに、単一のパッケージでpipが失敗しないようにします


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
requirements.txtからlxmlを削除します
RickyA 2014年

1
おかげで、この場合はうまくいきますが、一般的に、これを回避する方法はありますか?または、コマンドを実行するだけで正常であり、コマンドが失敗したことを確認してから、パッケージリストを整理しますか?
em 14年

5
パッケージがリストされrequirements.txtている場合、それはおそらく必要であるためpip、パッケージをインストールできない場合に失敗することは理にかなっています。とにかくそのパッケージなしでコードが実行される場合、それはほとんど要件ではありませんでした。失敗したパッケージをランダムにプルーニングrequirements.txtすると、依存関係が欠落するという問題が発生するだけのようです。
larsk、2014年

1
@larsks単一の開発環境またはパッケージに対して複数のrequirements.txtファイルを持つことは非常に一般的です。たとえば、単体/統合テスト環境やパフォーマンスプロファイリングを拡張するために使用できるが、厳密には必須ではないオプションツールが1つある場合があります。これらのパッケージと固定されたバージョンを表す単一のソースファイルをバージョン管理し、同じpip install -r <some file>ワークフローに依存して適切な環境の作成を標準化したいとします。
e-2019年

4
このことを考えると、pipはある種の正常な失敗/オプションのスキップ動作をサポートしてはならず、警告を出力するがそれをインストールする必要があることを示唆するのは非常に難聴のようです。これは、要件ファイルからこのタイプのPIPベースのインストールを行うための非常に一般的なニーズです。
-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コメントのすべてを削除し、空の行を取り除くために。
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。:-)
トレック

10

このソリューションは、requirements.txtの空行、空白行、#コメント行、whitespace-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の場合:

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)

pipバージョン<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)

「メイン」はピップの一部ではありません。エラー。
プランツェル

4

xargs解決策は動作しますが、移植性の問題(BSD / GNU)を有し、および/またはあなたの要件ファイルにコメントや空白行を持っている場合は面倒なことができます。

このような動作が必要となるユースケースについては、たとえば2つの個別の要件ファイルを使用します。1つは常にインストールする必要があるコア依存関係のみをリストし、もう1つはケースの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

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. 上記のコードをコピーして、同じディレクトリにpythonファイルとして保存します。.pyたとえば、拡張子を使用することを忘れないでください。install_packages.py
  3. コマンドを使用してこのファイルを実行します。 python install_packages.py
  4. 上記のすべてのパッケージは、停止することなく一度にインストールされます。:)

インストール機能で他のパラメーターを追加できます。お気に入り: main(['install'] + [str(package)] + ['--update'])

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.