回答:
とおりピップ1.3、そこにあるpip show
コマンド。
$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe
古いバージョンでは、pip freeze
とgrep
うまく仕事をする必要があります。
$ pip freeze | grep Jinja2
Jinja2==2.7.3
save
名前を使用します。
pip show pip
よりも、タイプしてpipのバージョン情報を取得できますpip --version
。
pip freeze
には編集可能なVCSチェックアウトバージョンが正しく表示されるという利点がありますが、表示されpip show
ません。
Hugo Tavaresの拡張機能を使用して、プルリクエストをpipで送信しました:
(例としてspecloud)
$ pip show specloud
Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
Pip 1.3には、リストコマンドもあります。
$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
pip list
一般的なものであり、そうで__version__
はありません。また、私は見ているversion()
と、get_version()
インポートされたいずれかの。
--outdatedを追加の引数として使用すると、使用しているパッケージの最新バージョンと最新バージョンを取得できます。
$ pip list --outdated
distribute (Current: 0.6.34 Latest: 0.7.3)
django-bootstrap3 (Current: 1.1.0 Latest: 4.3.0)
Django (Current: 1.5.4 Latest: 1.6.4)
Jinja2 (Current: 2.6 Latest: 2.8)
AdamKGの答えと組み合わせると:
$ pip list --outdated | grep Jinja2
Jinja2 (Current: 2.6 Latest: 2.8)
pip-toolsも確認してください:https : //github.com/nvie/pip-tools
インストールyolk
して実行することもできyolk -l
ます。これにより、優れた出力が得られます。これが私の小さなvirtualenvで得られるものです:
(venv)CWD> /space/vhosts/pyramid.xcode.com/venv/build/unittest
project@pyramid 43> yolk -l
Chameleon - 2.8.2 - active
Jinja2 - 2.6 - active
Mako - 0.7.0 - active
MarkupSafe - 0.15 - active
PasteDeploy - 1.5.0 - active
Pygments - 1.5 - active
Python - 2.7.3 - active development (/usr/lib/python2.7/lib-dynload)
SQLAlchemy - 0.7.6 - active
WebOb - 1.2b3 - active
account - 0.0 - active development (/space/vhosts/pyramid.xcode.com/project/account)
distribute - 0.6.19 - active
egenix-mx-base - 3.2.3 - active
ipython - 0.12 - active
logilab-astng - 0.23.1 - active
logilab-common - 0.57.1 - active
nose - 1.1.2 - active
pbkdf2 - 1.3 - active
pip - 1.0.2 - active
pyScss - 1.1.3 - active
pycrypto - 2.5 - active
pylint - 0.25.1 - active
pyramid-debugtoolbar - 1.0.1 - active
pyramid-tm - 0.4 - active
pyramid - 1.3 - active
repoze.lru - 0.5 - active
simplejson - 2.5.0 - active
transaction - 1.2.0 - active
translationstring - 1.1 - active
venusian - 1.0a3 - active
waitress - 0.8.1 - active
wsgiref - 0.1.2 - active development (/usr/lib/python2.7)
yolk - 0.4.3 - active
zope.deprecation - 3.5.1 - active
zope.interface - 3.8.0 - active
zope.sqlalchemy - 0.7 - active
最も簡単な方法はこれです:
import jinja2
print jinja2.__version__
__version__
は、ソースコードで定義されているパッケージでのみ機能します。多くのパッケージにはありません。
import
との出力の間のパッケージ名の不整合(少なくとも3つのタイプがある)に対しても堅牢ではありませんpip freeze
。
機械可読形式でパッケージバージョンのみを返すpython関数:
from importlib.metadata import version
version('numpy')
Python 3.8より前:
pip install importlib-metadata
from importlib_metadata import version
version('numpy')
同等のbash(ここでもpythonから呼び出されます)ははるかに複雑になります(ただし、より堅牢です-以下の注意を参照してください)。
import subprocess
def get_installed_ver(pkg_name):
bash_str="pip freeze | grep -w %s= | awk -F '==' {'print $2'} | tr -d '\n'" %(pkg_name)
return(subprocess.check_output(bash_str, shell=True).decode())
使用例:
# pkg_name="xgboost"
# pkg_name="Flask"
# pkg_name="Flask-Caching"
pkg_name="scikit-learn"
print(get_installed_ver(pkg_name))
>>> 0.22
なお、どちらの場合もpkg_name
で返される形式でパッケージ名が含まれている必要があり、パラメータpip freeze
やなどの際に使用されていないimport
、などscikit-learn
ではないsklearn
かFlask-Caching
、ではありませんflask_caching
。
pip freeze
bashバージョンでの呼び出しは非効率に思えるかもしれませんが、このメソッドだけがパッケージの命名の特異性と不整合(たとえば、アンダースコアとダッシュ、スモールとラージキャップ、sklearn
vs などの省略形scikit-learn
)に対して十分に堅牢であることがわかります。
注意:複雑な環境では、両方のバリアントが予期しないバージョン番号を返す可能性があり、実際に取得できる内容と一致しませんimport
。
このような問題の1つは、ユーザーの site-packages
サブフォルダーにパッケージの他のバージョンが隠されている場合に発生します。version()
ここで私が遭遇した状況を使用することの危険の例として:
$ pip freeze | grep lightgbm
lightgbm==2.3.1
and
$ python -c "import lightgbm; print(lightgbm.__version__)"
2.3.1
vs.
$ python -c "from importlib_metadata import version; print(version(\"lightgbm\"))"
2.2.3
until you delete the subfolder with the old version (here 2.2.3) from the user folder (only one would normally be preserved by `pip` - the one installed as last with the `--user` switch):
$ ls /home/jovyan/.local/lib/python3.7/site-packages/lightgbm*
/home/jovyan/.local/lib/python3.7/site-packages/lightgbm-2.2.3.dist-info
/home/jovyan/.local/lib/python3.7/site-packages/lightgbm-2.3.1.dist-info
別の問題は、同じ環境にcondaでインストールされたいくつかのパッケージがあることです。pipでインストールされたパッケージと依存関係を共有し、これらの依存関係のバージョンが異なる場合、pipでインストールされた依存関係のダウングレードが発生する可能性があります。
numpy
たとえば、2020年4月1日のPyPI で利用可能なの最新バージョンは1.18.0でしたが、同時にアナコンダのconda-forge
チャネルにはnumpy
最新バージョンとして1.17.3しかありませんでした。そのためbasemap
、conda(2番目)を使用してパッケージをインストールすると、以前にpipでインストールされたパッケージがconda numpy
によって1.17.3にダウングレードされ、バージョン1.18.0がimport
機能で使用できなくなります。この場合version()
は正しいでしょうpip freeze
/ conda list
間違っています:
$ python -c "from importlib_metadata import version; print(version(\"numpy\"))"
1.17.3
$ python -c "import numpy; print(numpy.__version__)"
1.17.3
$ pip freeze | grep numpy
numpy==1.18.0
$ conda list | grep numpy
numpy 1.18.0 pypi_0 pypi
importlib.metadata.version('NameOfProject')
ですか?docs.python.org/3/library/...
from importlib_metadata import version; version('Flask-Caching')
python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"
ませんか?
version()
まだ最も古い(最も古い)バージョン(2.2.3)を返します。--user
スイッチで両方のバージョンをインストールすることでこの結果を複製できlightgbm-2.2.3.dist-info
ますが、上記のように、フォルダーを手動で保持して、両方を一緒に保持します(通常、pipはそれを削除します-削除しない限り)。
pip showはpython 3.7で動作します:
pip show selenium
Name: selenium
Version: 4.0.0a3
Summary: Python bindings for Selenium
Home-page: https://github.com/SeleniumHQ/selenium/
Author: UNKNOWN
Author-email: UNKNOWN
License: Apache 2.0
Location: c:\python3.7\lib\site-packages\selenium-4.0.0a3-py3.7.egg
Requires: urllib3
Required-by:
Pythonコードを使用してこれを行うには:
importlib.metadata.version
import importlib.metadata
importlib.metadata.version('beautifulsoup4')
'4.9.1'
(を使用importlib_metadata.version
)
!pip install importlib-metadata
import importlib_metadata
importlib_metadata.version('beautifulsoup4')
'4.9.1'
pkg_resources.Distribution
import pkg_resources
pkg_resources.get_distribution('beautifulsoup4').version
'4.9.1'
pkg_resources.get_distribution('beautifulsoup4').parsed_version
<Version('4.9.1')>
sinorocとmirekphdによるコメントにクレジットされます。
show
pipにコマンドの提案があります:github.com/pypa/pip/issues/33