Easy_installまたはpipでインストールされたすべてのPython PyPIパッケージを見つける方法はありますか?つまり、配布ツール(この場合はDebianではapt-get)を使ってインストールされたものやインストールされたものはすべて除外します。
pip freeze
はインストールされたパッケージとそれらのバージョンのリストを出力します。また、後でそれらを新しい環境の設定に使用できるファイルに書き込むこともできます。
https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze
Pipのバージョン1.3以降、pip list
を使えるようになりました
期限切れのパッケージを表示する機能など、便利なオプションがいくつかあります。これがドキュメントです: https://pip.pypa.io/en/latest/reference/pip_list/
誰かが疑問に思っているなら、あなたは 'pip show'コマンドを使うことができます。
pip show [options] <package>
これは与えられたパッケージのインストールディレクトリをリストします。
Debianがpip install
デフォルトターゲットに関して最近のUbuntuバージョンのように振る舞うなら、それは非常に簡単です:それは/usr/local/lib/
(apt
デフォルトターゲット)の代わりに/usr/lib
にインストールします。 https://askubuntu.com/questions/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747 を確認してください。
私はArchLinuxユーザーです、そしてpipを使って実験したところ、私はこれと同じ問題に遭遇しました。これが私がArchでそれを解決した方法です。
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs pacman -Qo | grep 'No package'
ここで重要なのは/usr/lib/python2.7/site-packages
で、これはpipのインストール先ディレクトリ、YMMVです。 pacman -Qo
はArchの pac kage man agerがファイルの所有権をチェックする方法です。 No package
は、どのパッケージもファイルを所有していないときに返される戻り値の一部です:error: No package owns $FILENAME
。巧妙な回避策:__init__.py
はディレクトリに関しては少し無知なので、pacman -Qo
について問い合わせています:(
他のディストリビューションのためにそれをするためには、pip
がものをインストールする場所(ちょうどSudo pip install
何か)、ファイルの所有権を問い合わせる方法(Debian/Ubuntuメソッドはdpkg -S
)そして「no packageはそのパスを所有」 (Debian/Ubuntuはno path found matching pattern
です) Debian/Ubuntuユーザ、注意してください:dpkg -S
にシンボリックリンクを付けてしまうと失敗します。最初にrealpath
を使って解決してください。このような:
find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | xargs dpkg -S 2>&1 | grep 'no path found'
Fedoraユーザーは試すことができます(ありがとう@eddygeek):
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
皮切りに:
$ pip list
すべてのパッケージを一覧表示します。欲しいパッケージを見つけたら、次のコマンドを使います。
$ pip show <package-name>
フォルダを含めて、このパッケージに関する詳細が表示されます。あなたが既にパッケージ名を知っているなら、あなたは最初の部分を飛ばすことができます
Pip showの詳細については here を、pipリストの詳細については here をクリックしてください。
例:
$ pip show jupyter
Name: jupyter
Version: 1.0.0
Summary: Jupyter metapackage. Install all the Jupyter components in one go.
Home-page: http://jupyter.org
Author: Jupyter Development Team
Author-email: [email protected]
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel
以下は少し遅いですが、pip
が認識しているパッケージのきれいにフォーマットされたリストを提供します。つまり、それらのすべてが「by」pipによってインストールされたわけではありませんが、それらはすべてpipによってアップグレードできるはずです。
$ pip search . | egrep -B1 'INSTALLED|LATEST'
遅い理由は、pypiリポジトリ全体の内容をリストするためです。 ticketpip list
が同様の機能を提供することを提案していますが、より効率的です。
サンプル出力:(すべての検索を「。」ではなくサブセットに制限しました。)
$ pip search Selenium | egrep -B1 'INSTALLED|LATEST'
Selenium - Python bindings for Selenium
INSTALLED: 2.24.0
LATEST: 2.25.0
--
robotframework-Selenium2library - Web testing library for Robot Framework
INSTALLED: 1.0.1 (latest)
$
pip.get_installed_distributions()
はインストールされたパッケージのリストを与えます
import pip
from os.path import join
for package in pip.get_installed_distributions():
print(package.location) # you can exclude packages that's in /usr/XXX
print(join(package.location, package._get_metadata("top_level.txt"))) # root directory of this package
コンピュータに複数のバージョンのPythonがインストールされている場合、それぞれに関連付けられたpipのバージョンがいくつかある可能性があります。
あなたのアソシエーションによっては、どのpipコマンドを使用するのかについて非常に慎重になる必要があるかもしれません。
pip3 list
私のために働いていました、そこで私はPython3.4を実行しています。単にpip list
を使用するとエラーThe program 'pip' is currently not installed. You can install it by typing: Sudo apt-get install python-pip
が返されました。
新しいバージョンのpipには、OPが望むことをpip list -lまたはpip freeze -lを介して実行する機能があります。 Debianでは(少なくとも)manページはこれを明確にしていません、そして私はそれを発見しました - 機能が存在しなければならないという仮定の下で - pip list --help。
最近のコメントでは、この機能がドキュメントでも既存の回答でも明らかではないことを示唆しているものもあります(ヒントはありますが)ので、投稿するべきだと思いました。私はコメントとしてそれをすることを好むでしょうが、私は評判ポイントを持っていません。
@Paul Woolcockの答えに追加して、
$ pip freeze > requirements.txt
アクティブな環境の現在の場所に 要件ファイル all installed packagesを作成します。
$ pip install -r requirements.txt
要件を別の環境にインストールする。
これがFedoraや他のrpmディストリビューション用のワンライナーです(@barrapontoのヒントに基づく):
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
これを前のコマンドに追加すると、出力がきれいになります。
| sed -r 's:.*/(\w+)/__.*:\1:'
pip freezeは、pip/easy_installによるものでなくても、インストールされているすべてのパッケージを一覧表示します。 CentOs/Redhatではrpmでインストールされたパッケージが見つかりました。
すべてのファイル/フォルダ名をsite-packages/
(および存在する場合はdist-packages/
)で取得し、パッケージマネージャを使用してpackageを介してインストールされたものを取り除きます。
Pipをインストールしていない人のために、 github にこの簡単なスクリプトを見つけました(Python 2.7.13で動作します)。
import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
print distros[key]
@almenonが指摘したように、これはもはや機能せず、コード内のパッケージ情報を取得するためのサポートされた方法ではありません。次の場合は例外が発生します。
import pip
installed_packages = dict([(package.project_name, package.version)
for package in pip.get_installed_distributions()])
これを達成するために、pkg_resources
をインポートすることができます。これが例です:
import pkg_resources
installed_packages = dict([(package.project_name, package.version)
for package in pkg_resources.working_set])
私はv3.6.5
です
Anaconda pythonディストリビューションを使用している場合は、conda list
コマンドを使用して、インストールされたものをどの方法で確認できますか。
user@pc:~ $ conda list
# packages in environment at /anaconda3:
#
# Name Version Build Channel
_ipyw_jlab_nb_ext_conf 0.1.0 py36h2fc01ae_0
alabaster 0.7.10 py36h174008c_0
amqp 2.2.2 <pip>
anaconda 5.1.0 py36_2
anaconda-client 1.6.9 py36_0
pip
によってインストールされたエントリを取得するには(おそらくpip
自体も含む):
user@pc:~ $ conda list | grep \<pip
amqp 2.2.2 <pip>
astroid 1.6.2 <pip>
billiard 3.5.0.3 <pip>
blinker 1.4 <pip>
ez-setup 0.9 <pip>
feedgenerator 1.9 <pip>
もちろん、最初の列を選択したいだけかもしれません(必要ならpip
を除く)。
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}'
amqp
astroid
billiard
blinker
ez-setup
feedgenerator
最後に、これらの値を取得し、以下を使用してそれらすべてをpipアンインストールすることができます。
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y
-y
にpip uninstall
フラグを使用して、削除を確認する必要がないようにしてください。
少なくともUbuntuのために(多分他の人も)これを(このスレッドの前の ポスト からヒントを得た):
printf "Installed with pip:";
pip list 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo