すべての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
+cut
と sed
また 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+と互換性があります。
注:私はツールの著者です。
時代遅れのパッケージを印刷するだけです
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
あなたはこれを試すことができます:
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
pip list -o
古いパッケージをリストします。grep -v -i warning
倒立マッチwarning
更新時にエラーを回避しますcut -f1 -d1' '
最初の単語を返します - 時代遅れのパッケージの名前。tr "\n|\r" " "
からのマルチラインの結果を変換しますcut
単一ラインのスペース分離リストに。awk '{if(NR>=3)print}'
ヘッダーラインをスキップしますcut -d' ' -f1
最初の列を取得します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)
常にシェルを起動していないため、速く動作します。私はこれを実際に使用して、リストを時代遅れにして、物事をさらにスピードアップする時間を見つけたいと思っています。