Pip freezeを行うと、多数のPython私が明示的にインストールしなかったパッケージ、たとえば.
$ pip freeze
Cheetah==2.4.3
GnuPGInterface==0.3.2
Landscape-Client==11.01
M2Crypto==0.20.1
PAM==0.4.2
PIL==1.1.7
PyYAML==3.09
Twisted-Core==10.2.0
Twisted-Web==10.2.0
(etc.)
Pipがこれらの特定の依存パッケージをインストールした理由を判断する方法はありますか?言い換えると、これらのパッケージを依存関係として持っている親パッケージをどのように判断するのですか?
たとえば、Twistedを使用したい場合があります。誤ってパッケージをアンインストールしたりアップグレードしたりしないようにするまで、パッケージに依存したくありません。
pipdeptree を試すことができます。これは、依存関係をツリー構造として表示します。例:
$ pipdeptree
Lookupy==0.1
wsgiref==0.1.2
argparse==1.2.1
psycopg2==2.5.2
Flask-Script==0.6.6
- Flask [installed: 0.10.1]
- Werkzeug [required: >=0.7, installed: 0.9.4]
- Jinja2 [required: >=2.4, installed: 2.7.2]
- MarkupSafe [installed: 0.18]
- itsdangerous [required: >=0.21, installed: 0.23]
alembic==0.6.2
- SQLAlchemy [required: >=0.7.3, installed: 0.9.1]
- Mako [installed: 0.9.1]
- MarkupSafe [required: >=0.9.2, installed: 0.18]
ipython==2.0.0
slugify==0.0.1
redis==2.9.1
実行するには:
pip install pipdeptree
EDIT:@Estebanのコメントにあるように、-r
または-p <package_name>
を含む単一のパッケージなので、Werkzeugをインストールしたものを見つけるには、次のコマンドを実行できます。
$ pipdeptree -r -p Werkzeug
Werkzeug==0.11.15
- Flask==0.12 [requires: Werkzeug>=0.7]
pip show
コマンドは、指定されたパッケージに必要なパッケージを表示します(指定されたパッケージは既にインストールされている必要があります)。
$ pip show specloud
Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
pip show
はpipバージョン1.4rc5で導入されました
hn thread で最近言ったように、次のことをお勧めします。
主な依存関係を含むコメント付きrequirements.txt
ファイルを用意します。
## this is needed for whatever reason
package1
依存関係をインストールします:pip install -r requirements.txt
。 pip freeze -r requirements.txt
を使用して、依存関係の完全なリストを取得します。
## this is needed for whatever reason
package1==1.2.3
## The following requirements were added by pip --freeze:
package1-dependency1==1.2.3
package1-dependency1==1.2.3
これにより、ファイル構造をコメントで保持し、依存関係を依存関係の依存関係からうまく分離できます。このようにして、それらのいずれかを削除する必要がある日がずっと楽しくなります:)
次のことに注意してください。
requirements.raw
を再構築するために、バージョン管理付きのクリーンなrequirements.txt
を使用できます。pip install --no-install <package_name>
を使用します。要件のパッケージをpip showにパイプする1行のコマンドを使用することもできます。
cut -d'=' -f1 requirements.txt | xargs pip show
まず第一に pip freeze
は、現在インストールされているすべてのパッケージPythonを表示します。必ずしもPIPを使用しているわけではありません。
次に、Pythonパッケージには、依存パッケージに関する情報と 必須バージョン が含まれています。特定のpkgの依存関係は、メソッドを使用して確認できます ここで説明 。パッケージをアップグレードする場合、PIPなどのインストーラースクリプトが依存関係のアップグレードを処理します。
パッケージの更新を解決するには、 PIP要件ファイル を使用することをお勧めします。必要なパッケージとバージョンを定義し、pip installを使用してそれらを一度にインストールできます。
この問題を解決する簡単なスクリプトを書きました。次のスクリプトは、特定のパッケージの親(依存)パッケージを表示します。これにより、特定のパッケージをアップグレードまたはインストールしても安全であることを確認できます。次のように使用できます:dependants.py PACKAGENAME
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Find dependants of a Python package"""
import logging
import pip
import pkg_resources
import sys
__program__ = 'dependants.py'
def get_dependants(target_name):
for package in pip._internal.utils.misc.get_installed_distributions():
for requirement_package in package.requires():
requirement_name = requirement_package.project_name
if requirement_name == target_name:
yield package.project_name
# configure logging
logging.basicConfig(format='%(levelname)s: %(message)s',
level=logging.INFO)
try:
target_name = sys.argv[1]
except IndexError:
logging.error('missing package name')
sys.exit(1)
try:
pkg_resources.get_distribution(target_name)
except pkg_resources.DistributionNotFound:
logging.error("'%s' is not a valid package", target_name)
sys.exit(1)
print(list(get_dependants(target_name)))
(回避策、真の答えではない)
同じ問題がありました。lxmlがインストールされておらず、lxmlが必要な人を知りたいのです。 誰がlxmlを必要としていないか。で問題をバイパスしてしまいました。
私のサイトパッケージがどこに置かれているかに注意してください。
そこに行き、インポート用の再帰grepを実行します(最後のgrepの--invert-matchは、lxml自身のファイルを考慮から削除します)。
はい、それを行うためにpipを使用する方法についての答えではありませんが、何らかの理由で、ここでの提案からは成功しませんでした。
site-packages me$ egrep -i --include=*.py -r -n lxml . | grep import | grep --invert-match /lxml/