すべてのPythonパッケージをPIPでアップグレードする方法は?

StackOverflow https://stackoverflow.com/questions/2720014

  •  01-10-2019
  •  | 
  •  

質問

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

ノート: :それがあります 機能リクエスト これについては、公式の問題トラッカーで。

役に立ちましたか?

解決

まだ組み込みのフラグはありませんが、使用できます

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 また...)。

-n1 フラグ xargs 1つのパッケージを更新してもすべてを停止するのを防ぎます(ありがとう @andsens).

他のヒント

次の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)

すべてのローカルパッケージをアップグレードします。使用できます pip-review:

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

pip-review のフォークです pip-tools. 。見る pip-tools 問題 によって言及されています @knedlsepp. pip-review パッケージは機能しますが pip-tools パッケージは機能しなくなりました。

pip-review Windowsで動作します バージョン0.5以来.

Windowsで動作します。他の人にも良いはずです。 ($は、コマンドプロンプトのディレクトリにあります。例:c:/users/username>)

行う

$ pip freeze > requirements.txt

テキストファイルを開き、交換します ==>= 、および実行します

$ pip install -r requirements.txt --upgrade

アップグレードを失速させる特定のパッケージ(時々numpy)に問題がある場合は、ディレクトリ($)に移動し、名前にコメントし(その前に#を追加)、アップグレードを再度実行します。後でそのセクションを取り戻すことができます。これは、Pythonグローバル環境のコピーにも最適です。


別の方法:

私はまた、PIP-Reviewメソッドが気に入っています:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

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

「A」を選択して、すべてのパッケージをアップグレードできます。 1つのアップグレードが失敗した場合は、もう一度実行すると、次のアップグレードが続きます。

優れたコンサルティング後のWindowsバージョン ドキュメンテーション にとって FOR ロブ・ヴァン・デル・ウーデによる

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

使用する Pipupgrade!

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

Pipupgrade システム、ローカル、またはパッケージをアップグレードするのに役立ちます requirements.txt ファイル!また、変更を破らないパッケージを選択的にアップグレードします。 Pipupgradeは、複数のPython環境内に存在するパッケージをアップグレードすることも保証します。 Python2.7+、Python3.4+およびPIP9+、PIP10+、PIP18+、PIP19+と互換性があります。

enter image description here

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

時代遅れのパッケージを印刷するだけです

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

次のワンライナーはヘルプを証明するかもしれません:

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

このオプションは、私にはもっと簡単で読みやすいようです:

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}' 各行の最初の単語を選択します。

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

PIP3の場合これを使用してください:

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

PIPについては、3を削除するだけです。

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

OSX奇妙さ

OSXは、2017年7月の時点で、非常に古いバージョンの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コンポーネントのアップグレードは、デッドロックまたはパッケージデータベースの破損の潜在的な原因になる可能性があります。

これはより簡潔に思えます。

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になる

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

パッケージでパッケージをアップグレードする簡単な方法がなかったため、recumation.txtファイルを更新するために、これを書きました ピップアップグレード どれの また、あなたのバージョンを更新します 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 あなたの命令への議論。

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

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

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

ただし、最初に卵黄を取得する必要があります:

$ sudo pip install -U yolk

のワンライナーバージョン @ラマナの答え.

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

`

virtualenvを使用する場合、およびパッケージをアップグレードするだけの場合 追加した あなたのvirtualenvに、あなたはしたいかもしれません:

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

Windows PowerShellソリューション

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

私が見つけた最も簡単で最速のソリューション PIP Issue Discussion は:

sudo -H pip install pipdate
sudo -H pipdate

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

あなたはこれを試すことができます:

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

かなり驚くべき卵黄はこれを簡単にします。

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

卵黄の詳細については: https://pypi.python.org/pypi/yolk/0.4.3

おそらく便利だと思うことがたくさんあります。

awkアップデートパックを使用してください: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

Windows PowerShellの更新 foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}

@ラマナの答え ここで、私のために最善を尽くしましたが、いくつかのキャッチを追加する必要がありました。

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 チェックは、システムサイトパッケージディレクトリにないため、開発パッケージを除外します。 Try-Exectは、Pypiから削除されたパッケージを単純にスキップします。

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

通過します 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

これは私のために働いているようでした...

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

使った printf その後、パッケージ名を適切に分離するスペースがあります。

Windowsで最も短くて簡単なもの。

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

私のスクリプト:

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

これはもっと効果的ではありませんか?

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. grep -v -i warning 倒立マッチ warning 更新時にエラーを回避します
  3. cut -f1 -d1' ' 最初の単語を返します - 時代遅れのパッケージの名前。
  4. tr "\n|\r" " " からのマルチラインの結果を変換します cut 単一ラインのスペース分離リストに。
  5. awk '{if(NR>=3)print}' ヘッダーラインをスキップします
  6. cut -d' ' -f1 最初の列を取得します
  7. xargs -n1 pip install -U 左のパイプから1つの引数を取り、パッケージのリストをアップグレードするためにコマンドに渡します。

これは、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つずつアップグレードします。だからa

pip3 check
pip2 check

その後、依存関係が壊れていないことを確認する必要があります。

どうですか:

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

pip_upgrade_outdated 仕事はします。それによると ドキュメント:

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

常にシェルを起動していないため、速く動作します。私はこれを実際に使用して、リストを時代遅れにして、物事をさらにスピードアップする時間を見つけたいと思っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top