easy_installまたはpipでインストールされたすべてのPythonPyPIパッケージを見つける方法はありますか?つまり、配布ツール(この場合はDebianのapt-get)でインストールされた/インストールされたすべてのものを除外します。
18 に答える
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/
の代わりにインストールします。https://askubuntu.com/questions/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747を確認してください/usr/lib
apt
私は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です。Archpacman -Qo
のpackagemanagerがファイルの所有権をチェックする方法です。No package
は、ファイルを所有しているパッケージがない場合に返される戻り値の一部ですerror: No package owns $FILENAME
。トリッキーな回避策:ディレクトリに関しては少し無知な__init__.py
ので、私は質問しています:(pacman -Qo
他のディストリビューションでそれを行うには、pip
インストール場所(sudo pip install
何か)、ファイルの所有権を照会する方法(Debian / Ubuntuメソッドはdpkg -S
)、および「パッケージがそのパスを所有していない」リターン(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 には、pip list -l
またはpip freeze -l
( --list
) を介して OP が必要とすることを行う機能があります。
Debian (少なくとも) では、man ページはこれを明確にしておらず、機能が存在する必要があるという仮定の下で、pip list --help
.
この機能がドキュメントまたは既存の回答のいずれかで明らかではないことを示唆する最近のコメントがあるため (いくつかのヒントが示唆されています)、投稿する必要があると考えました。コメントとしてそうした方がよかったのですが、評判ポイントがありません。
以下は少し遅いですが、pip
認識しているパッケージの適切にフォーマットされたリストを提供します。つまり、それらのすべてが pip によって「」インストールされたわけではありませんが、すべて pip によってアップグレードできるはずです。
$ pip search . | egrep -B1 'INSTALLED|LATEST'
遅い理由は、pypi リポジトリ全体の内容を一覧表示するためです。同様の機能を提供することを提案するチケットを提出しましたpip 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)
$
@Paul Woolcockの答えに追加すると、
pip freeze > requirements.txt
は、現在の場所のアクティブな環境にインストールされているすべてのパッケージとインストールされているバージョン番号を含む要件ファイルを作成します。ランニング
pip install -r requirements.txt
要件ファイルで指定されたパッケージをインストールします。
コンピューターに複数のバージョンの 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
。
@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
これは、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:'
すべてのファイル/フォルダー名を取得しsite-packages/
(dist-packages/
存在する場合)、パッケージ マネージャーを使用して、パッケージ経由でインストールされたものを取り除きます。
pip freeze は、pip/easy_install によるものでなくても、インストールされているすべてのパッケージを一覧表示します。CentOs/Redhat では、rpm を介してインストールされたパッケージが見つかります。