開発中に変更されるpip要件ファイルがあります。
ことが可能pip
にすることがアンインストール表示されないものをインストールするだけでなく、要件ファイルには表示されませんパッケージ?標準的な方法はありますか?
これにより、pip要件ファイルをパッケージの正規リストにすることができます-「ifandonlyif」アプローチ。
更新:https://github.com/pypa/pip/issues/716で新機能として提案しました
開発中に変更されるpip要件ファイルがあります。
ことが可能pip
にすることがアンインストール表示されないものをインストールするだけでなく、要件ファイルには表示されませんパッケージ?標準的な方法はありますか?
これにより、pip要件ファイルをパッケージの正規リストにすることができます-「ifandonlyif」アプローチ。
更新:https://github.com/pypa/pip/issues/716で新機能として提案しました
回答:
簡単な答えはノーです。pipではそれを行うことはできません。
pip uninstall -r requirements.txt
-y
@Ommitのコマンドにaを追加して、Yキーを押して何度も入力する必要がないようにします。私の過ちから学びなさい。
pip uninstall -r requirements.txt
するだけです:requirements.txtのバージョンのみをアンインストールします。アンインストールした場合boto3==1.10.0
、たとえば、pip freeze
表示されるboto3==1.0.1
以前に、それ(または任意の旧バージョン)をインストールしている場合。
これにより、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をチェックしてください。パッケージ管理の世界では、この種の質問を少し時代遅れにする多くのことが起こっています。ただし、実際にはまだpip-toolsを非常に喜んで使用しています。
project.config
をElasticBeanstalkのDjangoのファイルに入れました:05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y"
。これで、のコメントを使用するだけで、環境を再構築せずにpipパッケージをロールバックできますrequirements.txt
。これにより、実際のダウンタイムを節約できます。ありがとうございました!
pip freeze
コメントをするかどうかはわかりませんが、いつかAPIに追加する可能性があり、追加する場合は有効になります。そうでない場合、上記はノーオペレーションです。ダッシュを使用すると、前のコマンドのstdinを使用できます。この場合、ダッシュは、requirements.txtの内容をの出力と比較するようにgrepに指示していますpip freeze
(pip freeze
このコンテキストでの出力はstdinと同義です)
pip
いいえ、の機能ではありません。本当にそのようなことが必要な場合は、の出力をpip freeze
と比較するスクリプトを作成できますrequirements.txt
が、それは価値があるよりも面倒な場合があります。
を使用するとvirtualenv
、次のように、クリーンな環境を作成してから(再)インストールする方が簡単で信頼性が高くなりますrequirements.txt
。
deactivate
rm -rf venv/
virtualenv venv/
source venv/bin/activate
pip install -r requirements.txt
requirements.txt
)場合、なぜそれが再びインストールされるのでしょうか?
これで、-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-sync
別の回答には手に負えない参照がありますが、OPの問題を正確に解決するため、独自の回答に値します。
pip-syncはrequirements.txt
ファイルを入力として受け取り、現在のPython環境を「補正」して、その中にあるものと完全に一致するようにしrequirements.txt
ます。これには、envには存在するが、には存在しないパッケージの削除が含まれます requirements.txt
。
例:私たちは私たちのENVは(のみ)3つのライブラリ含んすると仮定しlibA
、libB
とlibC
、のようなので、の:
> cat requirements.txt
libA==1.0
libB==1.1
libC==1.2
しかし、私たちのenvが現在含まlibC
とlibD
:
> 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
スティーブンの提案は素晴らしいアイデアですが、残念ながら、ファイルに直接の要件のみを含めると機能しません。これは私にはわかりやすいように思えます。
それ自体を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のようなローカルリポジトリを使用するのは理にかなっています
これは質問に直接答えるものではありませんが、requirements.txt
今よりも良い代替手段はを使用することPipfile
です。これはRubyと同様に機能しますGemfile
。現在、pipenv
ツールを使用する必要がありますが、うまくいけば、これは最終的にに組み込まれるでしょうpip
。これはpipenv clean
あなたが望むことをするコマンドを提供します。
(既存のrequirements.txt
をでインポートできることに注意してくださいpipenv install -r requirements.txt
。この後、が必要にPipfile
なり、requirements.txt
を削除できます。)
現在、以下を使用することが可能です。
pip uninstall -r requirements.txt