web-dev-qa-db-ja.com

Pipを使ってすべてのパッケージをアップグレードする

pipを使用して、すべてのPythonパッケージを一度にアップグレードすることは可能ですか?

公式のissue trackerに 機能要求があります これには注意してください。

1588
thedjpetersen

まだ組み込みのフラグはありませんが、あなたは使うことができます

pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

注意:これには無限の潜在的なバリエーションがあります。私はこの答えを短く単純にしておきますが、コメントのバリエーションを提案してください!

古いバージョンのpipでは、代わりにこれを使うことができます。

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

grepは、@ jawacheによって示唆されているように、編集可能な( "-e")パッケージ定義をスキップすることです。 (はい、grep + cutsedまたはawkまたはPerlまたは...に置き換えることができます。).

xargs-n1フラグは、1つのパッケージの更新が失敗した場合にすべてが停止するのを防ぎます( @andsens に感謝).

1818
rbp

次のPythonコードを使うことができます。 pip freezeとは異なり、これは警告やFIXMEエラーを表示しません。 pip <10.0.1の場合

import pip
from subprocess import call

packages = [dist.project_name for dist in pip.get_installed_distributions()]
call("pip install --upgrade " + ' '.join(packages), Shell=True)

pip> = 10.0.1の場合

import pkg_resources
from subprocess import call

packages = [dist.project_name for dist in pkg_resources.working_set]
call("pip install --upgrade " + ' '.join(packages), Shell=True)
573
Ramana

すべてのローカルパッケージをアップグレードする。 pip-review を使うことができます。

$ pip install pip-review
$ pip-review --local --interactive

pip-reviewpip-toolsのフォークです。 @knedlsepp で言及されている pip-tools issue を参照してください。 pip-reviewパッケージは機能しますが、pip-toolsパッケージは機能しません。

pip-reviewはWindows上で動作します バージョン0.5以降

545
jfs

Windows上で動作します。他の人にも良いでしょう。($はあなたがどんなディレクトリにいても、コマンドプロンプトで。例:C:/ Users/Username>)

行う

$ pip freeze > requirements.txt

テキストファイルを開き、==を> =に置き換えます。

それから

$ pip install -r requirements.txt --upgrade

特定のパッケージがアップグレードを止めることに問題がある場合(時々不調なことに)、単にディレクトリ($)に行き、名前をコメントアウトして(その前に#を追加して)再度アップグレードを実行してください。後でそのセクションのコメントを解除することができます。これはPythonのグローバル環境をコピーするのにも最適です。

私はピップレビューの方法も好きです。

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip_review --local --interactive

あなたはすべてのパッケージをアップグレードするために 'a'を選択することができます。 1つのアップグレードが失敗した場合は、もう一度実行して次のアップグレードに進みます。

216
azazelspeaks

Rob van der WoudeによるFORの優れた ドキュメント を調べた後のWindows版

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i
99
Piotr Dobrogost

古くなったパッケージだけを印刷できます

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
70
janrito

次のワンライナーが助けになるかもしれません:

pip list --format freeze --outdated | sed 's/(.*//g' | xargs -n1 pip install -U

エラーが発生してもxargs -n1は動き続けます。 

何が省略され、エラーが発生したのかをより詳細に制御する必要がある場合は、-n1フラグを追加して、無視するエラーを明示的に定義してください。

| sed 's/^<First characters of the error>.*//'

これが実用的な例です。

pip list --format freeze --outdated | sed 's/(.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U
58
raratiru

このオプションは私にはもっと直接的で読みやすいように思えます。

pip install -U `pip list --outdated | tail -n +3 | awk '{print $1}'`

説明は、pip list --outdatedがすべての古いパッケージのリストをこのフォーマットで出力することです。 

Package   Version Latest Type 
--------- ------- ------ -----
fonttools 3.31.0  3.32.0 wheel
urllib3   1.24    1.24.1 wheel
requests  2.20.0  2.20.1 wheel

tail -n +3は最初の2行をスキップし、awk '{print $1}'は各行の最初のWordを選択します。

51
Marc

これはもっと簡潔に思えます。

pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U

説明:

pip list --outdatedは次のような行を取得します

urllib3 (1.7.1) - Latest: 1.15.1 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]

cut -d ' ' -f1では、-d ' 'は区切り文字として「スペース」を設定し、-f1は最初の列を取得することを意味します。

したがって、上記の行は次のようになります。

urllib3
wheel

次に、それらをxargsに渡し、各行を追加引数としてコマンドpip install -Uを実行します

-n1は、各コマンドに渡される引数の数をpip install -Uに1に制限します

37
Shihao Xu

より堅牢なソリューション

Pip3の場合はこれを使います。

pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh

Pipの場合は、単に3sを削除してください。

pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh

OSX奇数

2017年7月の時点で、OSXには非常に古いバージョンのsed(12歳)が付属しています。拡張正規表現を取得するには、上記の解決策で-rの代わりに-Eを使用してください。

一般的なソリューションの問題解決

このソリューションはうまく設計されテストされています1最も人気のあるソリューションでも問題がありますが。

  • Pipコマンドライン機能の変更による移植性の問題
  • 一般的なpipまたはpip3子プロセスの失敗によるxargsのクラッシュ
  • 生のxargs出力からの混雑したロギング
  • 潜在的にそれをアップグレードしながらPython-to-OSブリッジに頼る3

上記のコマンドは、sedおよびshと組み合わせて最も単純で最も移植性の高いpip構文を使用して、これらの問題を完全に解決します。コメント付きバージョンでsed操作の詳細を精査することができます2


詳細

[1] Linux 4.8.16-200.fc24.x86_64クラスターでテストされ、定期的に使用され、他の5つのLinux/Unixフレーバーでテストされています。 Windows 10にインストールされたCygwin64でも動作します。iOSでのテストが必要です。

[2]コマンドの構造をより明確に見るために、これはコメント付きの上記のpip3コマンドとまったく同じです。 

# match lines from pip's local package list output
# that meet the following three criteria and pass the
# package name to the replacement string in group 1.
# (a) Do not start with invalid characters
# (b) Follow the rule of no white space in the package names
# (c) Immediately follow the package name with an equal sign
sed="s/^([^=# \t\\][^ \t=]*)=.*"

# separate the output of package upgrades with a blank line
sed="$sed/echo"

# indicate what package is being processed
sed="$sed; echo Processing \1 ..."

# perform the upgrade using just the valid package name
sed="$sed; pip3 install -U \1"

# output the commands
sed="$sed/p"

# stream edit the list as above
# and pass the commands to a Shell
pip3 freeze --local |sed -rn "$sed" |sh

[3] PythonまたはPIPコンポーネントのアップグレードでも使用されているPythonまたはPIPコンポーネントのアップグレードは、デッドロックまたはパッケージデータベースの破損の原因となる可能性があります。

28
Douglas Daseeco

アップグレードについても同じ問題がありました。つまり、すべてのパッケージをアップグレードすることはありません。プロジェクトが壊れる可能性があるので、私は必要なものだけをアップグレードします。

パッケージごとにアップグレードしてrequirements.txtファイルを更新する簡単な方法がなかったので、私はこれを書きました pip-upgrader which あなたのrequirements.txtファイルのバージョンも更新します 選択したパッケージ(またはすべてのパッケージ)の場合。

インストール

pip install pip-upgrader

使用方法

あなたのvirtualenvをアクティブにしてください(それは現在のvirtualenvにアップグレードされたパッケージの新しいバージョンもインストールするので重要です)。

cdをあなたのプロジェクトディレクトリに入れてから、以下を実行してください。

pip-upgrade

高度な使い方

要件が標準以外の場所に配置されている場合は、それらを引数として送信します。

pip-upgrade path/to/requirements.txt

どのパッケージをアップグレードしたいのかすでにわかっているのなら、単にそれらを引数として送ってください:

pip-upgrade -p Django -p celery -p dateutil

プレリリース版またはポストリリース版にアップグレードする必要がある場合は、コマンドに--prerelease引数を追加してください。

完全開示:私はこのパッケージを書きました。

27

からhttps://github.com/cakebread/yolk

$ pip install -U `yolk -U | awk '{print $1}' | uniq`

ただし、最初に卵黄を入手する必要があります。

$ Sudo pip install -U yolk
26
tkr

@ Ramana's answer のワンライナーバージョン。

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, Shell=1) for d in pip.get_installed_distributions()]'

`

24
Salman Abbas

virtualenvを使用していて、パッケージを 加えた だけアップグレードする場合は、次のようにします。

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade
16
brunobord

pipupgrade !を使用してください。

$ pip install pipupgrade
$ pipupgrade --latest --yes

pipupgrade requirements.txtファイルからあなたのシステム、ローカルあるいはパッケージをアップグレードするのを助けますそれはまた変更を壊さないパッケージを選択的にアップグレードします。 Python2.7以降、Python3.4以降、およびpip9以降、pip10以降、pip18以降と互換性があります。

enter image description here

注:私はこのツールの作者です。

Windows Powershellソリューション

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}
15
Apeirogon Prime

pip issueの議論 で私が見つけた最も簡単で最速の解決策は以下のとおりです。

Sudo -H pip install pipdate
Sudo -H pipdate

ソース: https://github.com/pypa/pip/issues/3819

13
RedEyed

これを試すことができます:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done
12
何宗翰

かなり素晴らしい卵黄がこれを容易にします。

pip install yolk3k # don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade

Yolkに関するより詳しい情報は: https://pypi.python.org/pypi/yolk/0.4.3

それはあなたがおそらく役に立つと思うたくさんのことをすることができます。

12
user1175849

@ Ramana's answer ここにいる人のうち、私のために最善を尽くしたが、いくつかキャッチを追加しなければならなかった:

import pip
for dist in pip.get_installed_distributions():
    if 'site-packages' in dist.location:
        try:
            pip.call_subprocess(['pip', 'install', '-U', dist.key])
        except Exception, exc:
            print exc

site-packagesチェックは私の開発パッケージを除外します、なぜならそれらはシステムのsite-packagesディレクトリにないからです。 try-exceptはPyPIから削除されたパッケージを単にスキップします。

@endolith:私も簡単なpip.install(dist.key, upgrade=True)を望んでいましたが、pipがコマンドライン以外で使われることを意図していたようには見えません(ドキュメントは内部APIについて言及していません。 docstringsを使用してください。

10
chbrown

ピップフォークにプルリクエストを送信しました ;それまでの間、私が書いたこのpipライブラリソリューションを使用してください。

from pip import get_installed_distributions
from pip.commands import install

install_cmd = install.InstallCommand()

options, args = install_cmd.parse_args([package.project_name
                                        for package in
                                        get_installed_distributions()])

options.upgrade = True
install_cmd.run(options, args)  # Chuck this in a try/except and print as wanted
9
Samuel Marks

これは私のために働くようでした...

pip install -U $(pip list --outdated|awk '{printf $1" "}')

その後、パッケージ名を正しく区切るためにprintfをスペースで使いました。

9
SaxDaddy

awkアップデートパッケージを使う: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

windows PowerShellのアップデート foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}

8
JohnDHH

私のスクリプト:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade
6
Icyblade

Windows上で最短かつ最も簡単。

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt
6
Ankireddy

これはもっと効果的ではないですか?

pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U 
  1. pip list -oは期限切れのパッケージの一覧です。
  2. 更新時のエラーを回避するためのwarningに対するgrep -v -i warningの反転一致
  3. cut -f1 -d1' 'は最初のWordを返します - 古いパッケージの名前です。
  4. tr "\n|\r" " "は、cutからの複数行の結果を1行のスペース区切りリストに変換します。
  5. awk '{if(NR>=3)print}'はヘッダー行をスキップします 
  6. cut -d' ' -f1は最初の列を取得します
  7. xargs -n1 pip install -Uは、その左側のパイプから1つの引数を取り、それをコマンドに渡してパッケージのリストをアップグレードします。
6
Alex V

pip_upgrade_outdated が仕事をします。によると docs

usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD]
                            [--serial | --parallel] [--dry_run] [--verbose]
                            [--version]

Upgrade outdated python packages with pip.

optional arguments:
  -h, --help         show this help message and exit
  -3                 use pip3
  -2                 use pip2
  --pip_cmd PIP_CMD  use PIP_CMD (default pip)
  --serial, -s       upgrade in serial (default)
  --parallel, -p     upgrade in parallel
  --dry_run, -n      get list, but don't upgrade
  --verbose, -v      may be specified multiple times
  --version          show program's version number and exit

ステップ1:

pip install pip-upgrade-outdated

ステップ2:

pip_upgrade_outdated
5
adrin
import pip
pkgs = [p.key for p in pip.get_installed_distributions()]
for pkg in pkgs:
    pip.main(['install', '--upgrade', pkg])

あるいは:

import pip
commands = ['install', '--upgrade']
pkgs = commands.extend([p.key for p in pip.get_installed_distributions()])
pip.main(commands)

シェルを起動し続けているわけではないので、速く動きます。私は実際に物事をスピードアップするために時代遅れのリストを使用して実際にこれを取得する時間を見つけるのが大好きです。

5
Steve Barnes

powerShell 5.1のadm権限を持つ1行、python 3.6.5およびpip ver 10.0.1

pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}

壊れたパッケージや特別なホイールがリストになければそれはスムーズに動きます...

どうですか?

pip install -r <(pip freeze) --upgrade
5
user8598996

私はRamanaのコードを試してみましたが、Ubuntuでは各コマンドにSudoを書かなければならないことがわかりました。これが私のubuntu 13.10で正常に動作するスクリプトです。

#!/usr/bin/env python
import pip
from subprocess import call

for dist in pip.get_installed_distributions():
    call("Sudo pip install --upgrade " + dist.project_name, Shell=True)
4
antibus

私は pur を最近使っています。それは簡単で要点です。アップグレードを反映するようにrequirements.txtファイルが更新され、その後は通常どおりrequirements.txtファイルを使用してアップグレードできます。

$ pip install pur
...
Successfully installed pur-4.0.1

$ pur
Updated boto3: 1.4.2 -> 1.4.4
Updated Django: 1.10.4 -> 1.10.5
Updated Django-bootstrap3: 7.1.0 -> 8.1.0
All requirements up-to-date.

$ pip install --upgrade -r requirements.txt
Successfully installed Django-1.10.5 ...
4
kichik

これは古いパッケージだけを更新するスクリプトです。 

import os, sys
from subprocess import check_output, call

file = check_output(["pip.exe",  "list", "--outdated", "--format=legacy"])
line = str(file).split()

for distro in line[::6]:
    call("pip install --upgrade " + distro, Shell=True)

レガシフォーマットとして出力されない新しいバージョンのpip(バージョン18以降)。

import os, sys
from subprocess import check_output, call

file = check_output(["pip.exe",  "list", "-o", "--format=json"])
line = str(file).split()

for distro in line[1::8]:
    distro = str(distro).strip('"\",')
    call("pip install --upgrade " + distro, Shell=True)
4
Storm Shadow

古いパッケージをすべて見る

 pip list --outdated --format=columns

インストール

 Sudo pip install pipdate

それからタイプする

 Sudo -H pipdate
4
Usman khan

これが私のrbpの答えのバリエーションです。これは「編集可能」なディストリビューションとディストリビューションをバイパスします。それはオリジナルの2つの欠陥を共有します:それは不必要に再ダウンロードして再インストールします。 1つのパッケージにエラーがあると、それ以降のすべてのパッケージのアップグレードが妨げられます。

pip freeze |sed -ne 's/==.*//p' |xargs pip install -U --

関連するバグレポート、bitbucketからの移行後、少しバラバラになった:

4
Tobu

これがPythonのスクリプトを使った別の方法です。

import pip, tempfile, contextlib

with tempfile.TemporaryFile('w+') as temp:
    with contextlib.redirect_stdout(temp):
        pip.main(['list','-o'])
    temp.seek(0)
    for line in temp:
        pk = line.split()[0]
        print('--> updating',pk,'<--')
        pip.main(['install','-U',pk])
4
Copperfield

これはPython 3用のPowerShellソリューションです。

pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }

そしてPython 2の場合:

pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }

これにより、パッケージが1つずつアップグレードされます。だから、

pip3 check
pip2 check

その後、依存関係が壊れていないことを確認してください。

4
Nils Ballmann

Cmdの1行:

for /F "delims= " %i in ('pip list --outdated --format=legacy') do pip install -U %i

だから、 

pip check 

その後、依存関係が壊れていないことを確認してください。

2
Ilya

そして、さらに別の方法です:for pkg in $(pip list | cut -d' ' -f1); do Sudo pip install --upgrade $pkg; done

2
user1529891
import os
import pip
from subprocess import call, check_call

pip_check_list = ['pip', 'pip3']
pip_list = []
FNULL = open(os.devnull, 'w')


for s_pip in pip_check_list:
    try:
        check_call([s_pip, '-h'], stdout=FNULL)
        pip_list.append(s_pip)
    except FileNotFoundError:
        pass


for dist in pip.get_installed_distributions():
    for pip in pip_list:
        call("{0} install --upgrade ".format(pip) + dist.project_name, Shell=True)

私は @ Ramana's answer を取ってpip3をやさしくしました。

2
Mo Ali

もう一つの答えとしてここに述べた: 

pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U

考えられる解決策です。このコマンドを使用しているときに、ここにあるコメントに権限に関する問題がありました。以下を少し変更することで私はそれらを解決しました。

pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 Sudo -H pip install -U

追加されたSudo -Hに注目してください。これにより、コマンドはroot権限でrumすることができました。 

2
thebeancounter

これが私のバリエーションです。

pip list --outdated --format=legacy | awk '{print $1;}' | xargs -n1 pip install -U
2
Jaime Arias
pip list -o | cut -d' ' -f1 | xargs -n1 pip install -U 2> /dev/null

2つの異なるバージョンのpythonがあり、すべてのpython3のパッケージをアップグレードするだけの場合は、pipの代わりにpip3を入力します。

2> /dev/nullは、迷惑なエラーメッセージをすべて取り除くためのものです 

1
AkaKaras

私が見つけることができる最短かつ最も簡単なもの:

pip install -U $(pip freeze | cut -d"=" -f1)

$(cmd)キーを使用すると、任意のシェルコマンドラインを折り返すことができます(出力を返します)。

1
Alexandre Huat

それをするための純粋なbash/zsh oneliner:

for p in $(pip list -o --format freeze); do pip install -U ${p%%=*}; done

または、素敵なフォーマットで:

for p in $(pip list -o --format freeze)
do
    pip install -U ${p%%=*}
done
1

すべてのインストール済みパッケージを更新するための素早い方法はこれでしょう:

for pkg in $(pip list | cut -d' ' -f1) ; do pip install $pkg -U ; done
0
Riccardo M.
python -c 'import pip; [pip.main(["install", "--upgrade", d.project_name]) for d in pip.get_installed_distributions()]'

ワンライナー!

アップグレードをpipによってのみインストールされたパッケージにしたい、そして他のツール(apt、yumなど)によってインストールされたパッケージをアップグレードしたくない場合は、私のUbuntuで使用するこのスクリプトを使用できます - この投稿 に基づく:

printf "To update with pip: pip install -U"
pip list --outdated 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo
0
keypress
  1. 最初にjqをインストールしてください(mac):

    $ brew install jq

2。

$pip3 install --upgrade  `pip3 list --outdated --format json | jq '.[] | .name' | awk -F'"' '{print $2}'`
0
Cando Zhou

レコードにJSON + JQ回答を追加するだけです。

pip list -o --format json | jq '.[] | .name' | xargs pip install -U
0
Alex

conda envでも有効な最善の解決策は次のとおりです。

pip freeze --local | grep -v '^\-e' | cut -d = -f 1 |cut -d ':' -f 2 | xargs -n1 pip install -U
0
ermiabivatan

以下のcmdスニペットは次のことを行います。

  • pipを最新バージョンにアップグレードします。
  • すべての古いパッケージをアップグレードします。
  • アップグレードされるパッケージごとに、バージョン指定子のrequirements.txtをチェックします。
@echo off
Setlocal EnableDelayedExpansion
rem https://stackoverflow.com/questions/2720014

echo Upgrading pip...
python -m pip install --upgrade pip
echo.

echo Upgrading packages...
set upgrade_count=0
pip list --outdated > pip-upgrade-outdated.txt
for /F "skip=2 delims= " %%i in (pip-upgrade-outdated.txt) do (
    echo ^>%%i
    set package=%%i
    set requirements=!package!

    rem for each outdated package check for any version requirements
    for /F %%r in (.\python\requirements.txt) do (
        call :substr "%%r" !package! _substr
        rem check if a given line refers to a package we are about to upgrade
        if "%%r" NEQ !_substr! (
            rem check if the line contains more than just a package name
            if "%%r" NEQ "!package!" (
                rem set requirements to what is contained in this line
                echo requirements: %%r
                set requirements=%%r
            )
        )
    )
    pip install --upgrade !requirements!
    set /a "upgrade_count+=1"
    echo.
)

if !upgrade_count!==0 (
    echo All packages are up to date.
) else (
    type pip-upgrade-outdated.txt
)
exit /b


:substr
rem string substition done in a separate subroutine -
rem allows expand both variables in the substring syntax
set str_source=%1
set str_search=%2
rem replace str_search with an empty string.
rem return the result in the 3rd parameter, passed by reference from the caller.
set "%~3=!str_source:%str_search%=!"
exit /b
0
Andy