開発中に変更される pip 要件ファイルがあります。
要件ファイルに表示されていないパッケージをアンインストールするだけでなく、表示されているパッケージをインストールすることもできpip
ますか? 標準的な方法はありますか?
これにより、pip 要件ファイルをパッケージの標準的なリストにすることができます。これは、「if and only if」アプローチです。
更新: https://github.com/pypa/pip/issues/716で新機能として提案しました
開発中に変更される pip 要件ファイルがあります。
要件ファイルに表示されていないパッケージをアンインストールするだけでなく、表示されているパッケージをインストールすることもできpip
ますか? 標準的な方法はありますか?
これにより、pip 要件ファイルをパッケージの標準的なリストにすることができます。これは、「if and only if」アプローチです。
更新: https://github.com/pypa/pip/issues/716で新機能として提案しました
これにより、requirements.txt にないものはすべてアンインストールされます。
pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y
-e
ただし、これは でインストールされたパッケージ、つまり git リポジトリなどからインストールされたパッケージでは正しく動作しません。-e
これらをスキップするには、次のフラグで始まるパッケージを除外します。
pip freeze | grep -v -f requirements.txt - | grep -v '^#' | grep -v '^-e ' | xargs pip uninstall -y
次に、明らかに:
pip install -r requirements.txt
2016 年の更新:
ただし、実際には上記のアプローチを実際に使用する必要はないでしょう。おそらくあなたが探していることを、はるかに堅牢な方法で達成できるものをチェックしてくださいpip-tools
。pip-sync
https://github.com/nvie/pip-tools
2016 年 5 月の更新:
も使用できるようpip uninstall -r requirements.txt
になりましたが、これは基本的に反対のことを実現します。requirements.txt
2019 年 5 月の更新:
pipenvまたはPoetryを確認してください。パッケージ管理の世界では、この種の質問が少し時代遅れになっていることがたくさんあります。とはいえ、私はまだ pip-tools をとても楽しく使っています。
-r requirements.txt
に引数を渡すことができるようになりましたpip uninstall
。
pip uninstall -r requirements.txt -y
少なくともpip
8.1.2 では、次のようにpip help uninstall
表示されます。
...
Uninstall Options:
-r, --requirement <file> Uninstall all the packages listed in the given requirements file. This option can be
used multiple times.
...
の機能ではpip
ありません。本当にそのようなことが必要な場合は、 の出力を と比較するスクリプトを作成できますがpip freeze
、requirements.txt
その価値よりも手間がかかる可能性があります。
を使用virtualenv
すると、次のように、クリーンな環境を作成してから (再) インストールする方が簡単で信頼性が高くなりますrequirements.txt
。
deactivate
rm -rf venv/
virtualenv venv/
source venv/bin/activate
pip install -r requirements.txt
簡単な答えはノーです。pipではそれを行うことはできません。
Stephen の提案は素晴らしいアイデアですが、残念ながら、ファイルに直接的な要件のみを含めるとうまくいきません。
を含むすべての依存関係がアンインストールされ、それ自体distribute
が分解されpip
ます。
仮想環境のバージョンを追跡する方法を次に示します。私は、直接的な要件のみを含め、最小限の .xml を維持しようとしてrequirements.txt
います。よくわからない場合は、バージョンの制約についても言及しません。
さらに、ファイル内の virtualenv の実際のステータスを保持し、バージョン追跡 (git など) に含めvenv.pip
ます。
サンプル ワークフローは次のとおりです。
バージョン追跡を使用して、virtualenv ワークスペースをセットアップします。
mkdir /tmp/pip_uninstalling
cd /tmp/pip_uninstalling
virtualenv venv
. venv/bin/activate
バージョン追跡システムを初期化します。
git init
echo venv > .gitignore
pip freeze > venv.pip
git add .gitignore venv.pip
git commit -m "Python project with venv"
依存関係のあるパッケージをインストールし、要件ファイルに含めます。
echo flask > requirements.txt
pip install -r requirements.txt
pip freeze > venv.pip
アプリのビルドを開始し、コミットして新しいブランチを開始します。
vim myapp.py
git commit -am "Simple flask application"
git checkout -b "experiments"
追加のパッケージをインストールします。
echo flask-script >> requirements.txt
pip install -r requirements.txt
pip freeze > venv.pip
...それで遊んでから、以前のバージョンに戻ってください
vim manage.py
git commit -am "Playing with flask-script"
git checkout master
ここで無関係なパッケージをアンインストールします:
pip freeze | grep -v -f venv.pip | xargs pip uninstall -y
このプロセスは git フックを使用して自動化できると思いますが、本題から外れないようにしましょう。
もちろん、パッケージ キャッシング システムやpip2piなどのローカル リポジトリを使用することは理にかなっています。
ここで @stephen-j-fuhry に便乗するのは、私が使用する同等の PowerShell です。
pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }
これは質問に直接答えるものではありませんが、requirements.txt
今よりも優れた代替手段はPipfile
. これは Ruby と同様に機能しGemfile
ます。現在、pipenv
ツールを使用する必要がありますが、これが最終的に に組み込まれることを願っていますpip
。これにより、pipenv clean
必要なことを行うコマンドが提供されます。
requirements.txt
(既存のwithをインポートできることに注意してくださいpipenv install -r requirements.txt
。この後、 が必要Pipfile
で、requirements.txt
は削除できます。)
以下を使用して可能になりました:
pip uninstall -r requirements.txt