pip要件ファイルを使用してパッケージをアンインストールおよびインストールするにはどうすればよいですか?


89

開発中に変更されるpip要件ファイルがあります。

ことが可能pipにすることがアンインストール表示されないものをインストールするだけでなく、要件ファイルには表示されませんパッケージ?標準的な方法はありますか?

これにより、pip要件ファイルをパッケージの正規リストにすることができます-「ifandonlyif」アプローチ。

更新https://github.com/pypa/pip/issues/716で新機能として提案しました


3
プログラムがパッケージを必要としないという理由だけで、pipが任意のパッケージをアンインストールすることを本当に望んでいますか?ちょっと危険な音...
スコット・ハンター

11
@ScottHunterサイトパッケージのないvirtualenvを使用している場合は、それを実行するのが妥当です。
Michael

1
@ScottHunterはい、制御された(仮想)環境を使用していて、そこにあるものを確認したい場合はそうです。予期しない依存関係など、問題を引き起こす可能性のあるものは他にありません。
wodow 2012年

@MichaelMiorそれが答えなら、答えとして追加してください。私はそれを受け入れます!
wodow 2012年

@wodow完了。私が答えとして投稿しなかった唯一の理由は、あなたが望むものにあなたを導くことができるおそらくもっと役立つ解決策があるからです。
Michael Mior 2012年

回答:


16

簡単な答えはノーです。pipではそれを行うことはできません。


32
スティーブンが以下に言うように:pip uninstall -r requirements.txt
Ommit 2016

31
@Ommitこれは、要件ファイルに表示されないパッケージをアンインストールしません。ファイルに含まれているすべてのパッケージをアンインストールします。
Michael Mior 2016

3
@Micheal Mior、ああ、私は元の質問に十分な注意を払っていませんでした。私の悪い。
Ommit 2016

4
-y@Ommitのコマンドにaを追加して、Yキーを押して何度も入力する必要がないようにします。私の過ちから学びなさい。
グレッグヒルストン2018

1
追加pip uninstall -r requirements.txtするだけです:requirements.txtのバージョンのみをアンインストールします。アンインストールした場合boto3==1.10.0、たとえば、pip freeze表示されるboto3==1.0.1以前に、それ(または任意の旧バージョン)をインストールしている場合。
ジョーダンマッキー

125

これにより、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-toolspip-syncおそらくはるかに堅牢な方法で実行しようとしていることを達成します。

https://github.com/nvie/pip-tools

2016年5月の更新:

pip uninstall -r requirements.txtこれで使用することもできますが、これは基本的に逆のことを実現します-ですべてをアンインストールしますrequirements.txt

2019年5月の更新:

pipenvをチェックしてください。パッケージ管理の世界では、この種の質問を少し時代遅れにする多くのことが起こっています。ただし、実際にはまだpip-toolsを非常に喜んで使用しています。


5
それはいいね。私には、requirements.txtを更新せずに、1つのホストに手動で何かをインストールした場合に、すべてを壊すことによって、開発者に依存関係について明示的にさせる良い方法のように思えます。その機能を追加するプルリクエストがどのようなフィードバックを生成するのか興味があります。
Stephen Fuhry 2013

これが正解です!これproject.configをElasticBeanstalkのDjangoのファイルに入れました:05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y"。これで、のコメントを使用するだけで、環境を再構築せずにpipパッケージをロールバックできますrequirements.txt。これにより、実際のダウンタイムを節約できます。ありがとうございました!
e.thompsy 2014

#で始まるpipフリーズの出力はありますか?言い換えれば、2番目のgrepは必要ですか?
xor 2015

1
pip freezeコメントをするかどうかはわかりませんが、いつかAPIに追加する可能性があり、追加する場合は有効になります。そうでない場合、上記はノーオペレーションです。ダッシュを使用すると、前のコマンドのstdinを使用できます。この場合、ダッシュは、requirements.txtの内容をの出力と比較するようにgrepに指示していますpip freezepip freezeこのコンテキストでの出力はstdinと同義です)
Stephen Fuhry

1
私はpip-toolsを強くお勧めします。+1
ロンロスマン

16

pipいいえ、の機能ではありません。本当にそのようなことが必要な場合は、の出力をpip freezeと比較するスクリプトを作成できますrequirements.txtが、それは価値があるよりも面倒な場合があります。

を使用するとvirtualenv、次のように、クリーンな環境を作成してから(再)インストールする方が簡単で信頼性が高くなりますrequirements.txt

deactivate
rm -rf venv/
virtualenv venv/
source venv/bin/activate
pip install -r requirements.txt

6
一部のパッケージ(PIL、lxmlなど)で長時間のコンパイルが必要な場合、特に仮想環境を使用しているライブサーバーでこれを実行している場合は、要件ファイルに含まれていないパッケージをアンインストールすると便利です。
melinath 2012

@melinath要件ファイルになく、すでにインストールされている場合は、コンパイルを再度行う必要はありません。
Michael Mior 2014年

1
@ MichaelMior-この回答が示すように、たとえば、virtualenv全体をワイプする場合を除きます。
melinath 2014年

1
@melinathしかし、virtualenvをワイプし、パッケージが必要ない(そしてパッケージにないrequirements.txt)場合、なぜそれが再びインストールされるのでしょうか?
Michael Mior 2014年

3
@MichaelMior元のコメントをもっと明確に述べてみます。あなたは私が言っていた点を誤解しているようです。PILとlxmlを含む単純な要件ファイルを想像してみてください。しかし、その後、lxmlはもう必要ないと判断し、要件ファイルから削除します。この回答が示すように実行し、virtualenvをワイプする場合は、PILを再インストール(および再コンパイル)する必要があります。単にアンインストールlxmlのためのオプションを持っているために、より効率的である(すなわち、すべてのパッケージではない要件ファイルインチ)
melinath

11

これで、-r requirements.txt引数をに渡すことができますpip uninstall

pip uninstall -r requirements.txt -y

少なくともpip8.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.
...

3
これは、ファイルに表示されないパッケージをアンインストールしません。これは、パッケージをアンインストールしますファイルに表示されます。
MichaelMior19年

4

これは古い質問ですが(良い質問です)、質問されてから状況は大きく変わりました。

pip-sync別の回答には手に負えない参照がありますが、OPの問題を正確に解決するため、独自の回答に値します。

pip-syncrequirements.txtファイルを入力として受け取り、現在のPython環境を「補正」して、その中にあるものと完全に一致するようにしrequirements.txtます。これには、envには存在するが、には存在しないパッケージの削除が含まれます requirements.txt

例:私たちは私たちのENVは(のみ)3つのライブラリ含んすると仮定しlibAlibBlibC、のようなので、の:

> cat requirements.txt
libA==1.0
libB==1.1
libC==1.2

しかし、私たちのenvが現在含まlibClibD

> pip freeze
libC==1.2
libD==1.3

pip-syncを実行すると、これが最終的な状態になります。

> pip-sync requirements.txt
> pip freeze
libA==1.0
libB==1.1
libC==1.2

グローバルにインストールされたpip-toolsがある場合、現在アクティブ化されているvirtualenvではアンインストールされないことに注意してください...それでも奇妙ですが、それ以外の点では、私が知っている最も簡単な要件管理ツールです。
benzkji

3

スティーブンの提案は素晴らしいアイデアですが、残念ながら、ファイルに直接の要件のみを含めると機能しません。これは私にはわかりやすいように思えます。

それ自体をdistribute分解するpipことも含めて、すべての依存関係がアンインストールされます。

仮想環境のバージョン追跡中にクリーンな要件ファイルを維持する

仮想環境のバージョンを追跡する方法は次のとおりです。私requirements.txtは、直接の要件のみを含め、最小限を維持しようとしています。また、わからない場合はバージョンの制約についても言及していません。

しかし、それに加えて、私は仮想環境の実際のステータスをvenv.pipファイルに保持し、バージョン追跡(たとえばgit)に含めます。

サンプルワークフローは次のとおりです。


バージョン追跡を使用して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のようなローカルリポジトリを使用するのは理にかなっています


2

@ stephen-j-fuhryを便乗させるのは、私が使用するPowerShellと同等のものです。

pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }

0

これは質問に直接答えるものではありませんが、requirements.txt今よりも良い代替手段はを使用することPipfileです。これはRubyと同様に機能しますGemfile。現在、pipenvツールを使用する必要がありますが、うまくいけば、これは最終的にに組み込まれるでしょうpip。これはpipenv cleanあなたが望むことをするコマンドを提供します。

(既存のrequirements.txtをでインポートできることに注意してくださいpipenv install -r requirements.txt。この後、が必要にPipfileなり、requirements.txtを削除できます。)


-3

現在、以下を使用することが可能です。

pip uninstall -r requirements.txt

2
これは、要件ファイルに表示されていないパッケージをアンインストールしません。これは、すべてのパッケージをアンインストールしますファイルに表示されます。
Michael Mior 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.