私のPythonインストール(UNIXサーバー)にあるPythonモジュールのリストを取得したいと思います。
コンピューターにインストールされているPythonモジュールのリストを取得するにはどうすればよいですか?
私のPythonインストール(UNIXサーバー)にあるPythonモジュールのリストを取得したいと思います。
コンピューターにインストールされているPythonモジュールのリストを取得するにはどうすればよいですか?
回答:
pip freeze
Pythonスクリプトから-のようなリストを取得するための50セント:
import pip
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
for i in installed_packages])
print(installed_packages_list)
(長すぎる)ワンライナーとして:
sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
与える:
['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24',
'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3',
'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1',
'werkzeug==0.9.4']
このソリューションは、システムスコープまたは仮想環境スコープに適用されsetuptools
、pip
および(god forbid)によってインストールされたパッケージを対象としていますeasy_install
。
この呼び出しの結果をフラスコサーバーに追加したので、これを呼び出すとhttp://example.com/exampleServer/environment
、サーバーのvirtualenvにインストールされているパッケージのリストが表示されます。デバッグがずっと簡単になります。
この手法の奇妙な動作に気づきました。Pythonインタープリターがsetup.py
ファイルと同じディレクトリで呼び出されると、によってインストールされたパッケージがリストされませんsetup.py
。
$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $
gitリポジトリをクローンする setup.py
(test_env) $ git clone https://github.com/behave/behave.git
Cloning into 'behave'...
remote: Reusing existing pack: 4350, done.
remote: Total 4350 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4350/4350), 1.85 MiB | 418.00 KiB/s, done.
Resolving deltas: 100% (2388/2388), done.
Checking connectivity... done.
私たちは行動setup.py
し/tmp/behave
ます:
(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
git repoからpythonパッケージをインストールします
(test_env) $ cd /tmp/behave && pip install .
running install
...
Installed /private/tmp/test_env/lib/python2.7/site-packages/enum34-1.0-py2.7.egg
Finished processing dependencies for behave==1.2.5a1
/tmp
>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['behave==1.2.5a1', 'enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp'
/tmp/behave
>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp/behave'
behave==1.2.5a1
作業ディレクトリにbehave
のsetup.py
ファイルが含まれているため、2番目の例にはがありません。
ドキュメントにこの問題への言及はありませんでした。多分私はそれのためにバグをオープンするでしょう。
import pkg_resources; installed_packages = [(d.project_name, d.version) for d in pkg_resources.working_set]
AttributeError: module 'pip' has no attribute 'get_installed_distributions'
。
help('modules')
Pythonシェル/プロンプトで。
pydoc modules
機能します。回答として提出してください。
python -c 'help("modules")'
さて、これらの方法を自分で試してみたところ、宣伝されているとおりの結果が得られました。すべてのモジュールです。
悲しいかな、本当にあなたはstdlibをあまり気にしません、あなたはpythonのインストールで何が得られるか知っています。
本当に、私はインストールされています。
実際、驚くべきことに、うまく機能したのは次のとおりです。
pip freeze
返されたもの:
Fabric==0.9.3
apache-libcloud==0.4.0
bzr==2.3b4
distribute==0.6.14
docutils==0.7
greenlet==0.3.1
ipython==0.10.1
iterpipes==0.4
libxml2-python==2.6.21
「驚くべきことに」私が言うのは、パッケージインストールツールはこの機能が見つかると予想される正確な場所です。Pip 0.8.2、Python 2.7。
pipバージョン1.3以降、次のものにアクセスできます。
pip list
これは「ピップフリーズ」の構文上の砂糖のようです。インストールまたはvirtualenvに固有のすべてのモジュールが、バージョン番号とともに一覧表示されます。残念ながら、モジュールの現在のバージョン番号は表示されず、食器洗いや靴磨きも行われません。
pip list
最もシンプルで最高です。ここではオプションと詳細です。
ではipython
、あなた「と入力することができますimport
Tab」。
標準のPythonインタープリターでは、「help('modules')
」と入力できます。
コマンドラインでは、を使用できます。pydoc
modules
スクリプトでを呼び出しますpkgutil.iter_modules()
。
pkgutil.iter_modules()
上記のpipソリューションはすべてのパッケージを一覧表示するのではなく、pipを介してインストールされたパッケージのみを一覧表示します。
python -c 'import pkgutil;print [x[1] for x in list(pkgutil.iter_modules())]'
。すべてのモジュール名を1つの非常に大きなPythonリストとしてダンプする必要があります。このx[1]
ビットは、によって生成されたタプルからモジュール名を取り出すために使用されpkgutil.iter_modules()
ます。
これを使用して、現在使用されているモジュールを確認します。
import sys as s
s.modules.keys()
Pythonで実行されているすべてのモジュールが表示されます。
すべての組み込みモジュールの使用:
s.modules
これは、すべてのモジュールとインポートオブジェクトを含むdictです。
pydoc
もpip
インストールもされていない制約付きシステム(私の場合はNAS)で機能するように見える唯一の方法だからです。
help('modules')
応答せずにハングアップします。しかし、このアプローチはsys
完全に機能します
通常のシェルでは単に使う
pydoc modules
py -m pydoc modules
、cmdまたはPowershellで実行できます。
pydoc modules
Python 3.6を搭載したWindows 10では動作しませんでしたが、@ VKKの変更:py -m pydoc modules
cmd / Powershell では動作します。
pip 10以降、受け入れられた回答は機能しなくなります。開発チームは、get_installed_distributions
ルーチンへのアクセスを削除しました。には、setuptools
同じことを行うための代替機能があります。以下は、pip 10で動作する代替バージョンです。
import pkg_resources
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
for i in installed_packages])
print(installed_packages_list)
以前のバージョンのpipでも動作するかどうかをお知らせください。
pip freeze
。このトピックに関する私の知識の深さはかなり限られています。受け入れられた回答がうまくいかなかったとき、私は解決策にたどり着きましたsetuptools
。それを関連する回答と組み合わせて試してみました。
get_installed_distributions routine
。
setuptools
。
pkgutil.iter_modulesを使用した非常に単純な検索
from pkgutil import iter_modules
a=iter_modules()
while True:
try: x=a.next()
except: break
if 'searchstr' in x[1]: print x[1]
for m in iter_modules()
して書いたが、それもうまくいった。
ターミナルまたはIPythonで、次のように入力します。
help('modules')
その後
In [1]: import #import press-TAB
Display all 631 possibilities? (y or n)
ANSI audiodev markupbase
AptUrl audioop markupsafe
ArgImagePlugin avahi marshal
BaseHTTPServer axi math
Bastion base64 md5
BdfFontFile bdb mhlib
BmpImagePlugin binascii mimetools
BufrStubImagePlugin binhex mimetypes
CDDB bisect mimify
CDROM bonobo mmap
CGIHTTPServer brlapi mmkeys
Canvas bsddb modulefinder
CommandNotFound butterfly multifile
ConfigParser bz2 multiprocessing
ContainerIO cPickle musicbrainz2
Cookie cProfile mutagen
Crypto cStringIO mutex
CurImagePlugin cairo mx
DLFCN calendar netrc
DcxImagePlugin cdrom new
Dialog cgi nis
DiscID cgitb nntplib
DistUpgrade checkbox ntpath
このソリューションは主にモジュールに基づいてimportlib
おりpkgutil
、CPython 3.4およびCPython 3.5で動作しますが、CPython 2はサポートされていません。
説明
sys.builtin_module_names
-すべての組み込みモジュールに名前を付けます(ここで私の答えを見てください)pkgutil.iter_modules()
-使用可能なすべてのモジュールに関する情報を返しますimportlib.util.find_spec()
-存在する場合、インポートするモジュールに関する情報を返しますBuiltinImporter
-組み込みモジュールのインポーター(docs)SourceFileLoader
-標準Pythonモジュールのインポーター(デフォルトでは拡張子* .py)(docs)ExtensionFileLoader
- 共有ライブラリとしてのモジュールのインポーター(CまたはC ++で作成)完全なコード
import sys
import os
import shutil
import pkgutil
import importlib
import collections
if sys.version_info.major == 2:
raise NotImplementedError('CPython 2 is not supported yet')
def main():
# name this file (module)
this_module_name = os.path.basename(__file__).rsplit('.')[0]
# dict for loaders with their modules
loaders = collections.OrderedDict()
# names`s of build-in modules
for module_name in sys.builtin_module_names:
# find an information about a module by name
module = importlib.util.find_spec(module_name)
# add a key about a loader in the dict, if not exists yet
if module.loader not in loaders:
loaders[module.loader] = []
# add a name and a location about imported module in the dict
loaders[module.loader].append((module.name, module.origin))
# all available non-build-in modules
for module_name in pkgutil.iter_modules():
# ignore this module
if this_module_name == module_name[1]:
continue
# find an information about a module by name
module = importlib.util.find_spec(module_name[1])
# add a key about a loader in the dict, if not exists yet
loader = type(module.loader)
if loader not in loaders:
loaders[loader] = []
# add a name and a location about imported module in the dict
loaders[loader].append((module.name, module.origin))
# pretty print
line = '-' * shutil.get_terminal_size().columns
for loader, modules in loaders.items():
print('{0}\n{1}: {2}\n{0}'.format(line, len(modules), loader))
for module in modules:
print('{0:30} | {1}'.format(module[0], module[1]))
if __name__ == '__main__':
main()
使用法
CPython3.5(切り捨て)
$ python3.5 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
30: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast | built-in
_codecs | built-in
_collections | built-in
_functools | built-in
_imp | None
_io | built-in
_locale | built-in
_operator | built-in
_signal | built-in
_sre | built-in
_stat | built-in
_string | built-in
_symtable | built-in
_thread | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
227: <class '_frozen_importlib_external.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__ | /usr/local/lib/python3.5/__future__.py
_bootlocale | /usr/local/lib/python3.5/_bootlocale.py
_collections_abc | /usr/local/lib/python3.5/_collections_abc.py
_compat_pickle | /usr/local/lib/python3.5/_compat_pickle.py
_compression | /usr/local/lib/python3.5/_compression.py
_dummy_thread | /usr/local/lib/python3.5/_dummy_thread.py
_markupbase | /usr/local/lib/python3.5/_markupbase.py
_osx_support | /usr/local/lib/python3.5/_osx_support.py
_pydecimal | /usr/local/lib/python3.5/_pydecimal.py
_pyio | /usr/local/lib/python3.5/_pyio.py
_sitebuiltins | /usr/local/lib/python3.5/_sitebuiltins.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
64: <class '_frozen_importlib_external.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bisect | /usr/local/lib/python3.5/lib-dynload/_bisect.cpython-35m-x86_64-linux-gnu.so
_bz2 | /usr/local/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so
_codecs_cn | /usr/local/lib/python3.5/lib-dynload/_codecs_cn.cpython-35m-x86_64-linux-gnu.so
_codecs_hk | /usr/local/lib/python3.5/lib-dynload/_codecs_hk.cpython-35m-x86_64-linux-gnu.so
_codecs_iso2022 | /usr/local/lib/python3.5/lib-dynload/_codecs_iso2022.cpython-35m-x86_64-linux-gnu.so
(****************************truncated*******************************)
CPython3.4の場合(切り捨て)
$ python3.4 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
54: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast | built-in
_bisect | built-in
_codecs | built-in
_collections | built-in
_datetime | built-in
_elementtree | built-in
_functools | built-in
_heapq | built-in
_imp | None
_io | built-in
_locale | built-in
_md5 | built-in
_operator | built-in
_pickle | built-in
_posixsubprocess | built-in
_random | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
246: <class '_frozen_importlib.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__ | /usr/lib/python3.4/__future__.py
_bootlocale | /usr/lib/python3.4/_bootlocale.py
_collections_abc | /usr/lib/python3.4/_collections_abc.py
_compat_pickle | /usr/lib/python3.4/_compat_pickle.py
_dummy_thread | /usr/lib/python3.4/_dummy_thread.py
_markupbase | /usr/lib/python3.4/_markupbase.py
_osx_support | /usr/lib/python3.4/_osx_support.py
_pyio | /usr/lib/python3.4/_pyio.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
44: <class '_frozen_importlib.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bz2 | /usr/lib/python3.4/lib-dynload/_bz2.cpython-34m-x86_64-linux-gnu.so
_codecs_cn | /usr/lib/python3.4/lib-dynload/_codecs_cn.cpython-34m-x86_64-linux-gnu.so
_codecs_hk | /usr/lib/python3.4/lib-dynload/_codecs_hk.cpython-34m-x86_64-linux-gnu.so
_codecs_iso2022 | /usr/lib/python3.4/lib-dynload/_codecs_iso2022.cpython-34m-x86_64-linux-gnu.so
_codecs_jp | /usr/lib/python3.4/lib-dynload/_codecs_jp.cpython-34m-x86_64-linux-gnu.so
_codecs_kr | /usr/lib/python3.4/lib-dynload/_codecs_kr.cpython-34m-x86_64-linux-gnu.so
_codecs_tw | /usr/lib/python3.4/lib-dynload/_codecs_tw.cpython-34m-x86_64-linux-gnu.so
_crypt | /usr/lib/python3.4/lib-dynload/_crypt.cpython-34m-x86_64-linux-gnu.so
(****************************truncated*******************************)
pip
、Pythonで記述されたソフトウェアパッケージのインストールと管理に使用されるパッケージ管理システムに基づいており、その結果pip.get_installed_distributions()
、pipでインストールされたモジュールが返されます。私の回答は完全にPythonの標準ライブラリに基づいており、インポート可能なすべてのモジュールをカバーしています。最大の欠点は私の答え
**truncated**
、出力が切り捨てられるという特別な意味があります。注意していないかもしれませんが、そうでない場合は、システムとPythonの実装に関する情報を送信するために、修正のためにさらに調査を行います。
警告:Adam Matanは、pip> 10.0でのこの使用を推奨していません。また、以下の@sinorocのコメントを読んでください
これは、Adam Matanの回答(受け入れられたもの)に触発されました。
import tabulate
try:
from pip import get_installed_distributions
except:
from pip._internal.utils.misc import get_installed_distributions
tabpackages = []
for _, package in sorted([('%s %s' % (i.location, i.key), i) for i in get_installed_distributions()]):
tabpackages.append([package.location, package.key, package.version])
print(tabulate.tabulate(tabpackages))
次に、次の形式で表を出力します。
19:33 pi@rpi-v3 [iot-wifi-2] ~/python$ python installed_packages.py
------------------------------------------- -------------- ------
/home/pi/.local/lib/python2.7/site-packages enum-compat 0.0.2
/home/pi/.local/lib/python2.7/site-packages enum34 1.1.6
/home/pi/.local/lib/python2.7/site-packages pexpect 4.2.1
/home/pi/.local/lib/python2.7/site-packages ptyprocess 0.5.2
/home/pi/.local/lib/python2.7/site-packages pygatt 3.2.0
/home/pi/.local/lib/python2.7/site-packages pyserial 3.4
/usr/local/lib/python2.7/dist-packages bluepy 1.1.1
/usr/local/lib/python2.7/dist-packages click 6.7
/usr/local/lib/python2.7/dist-packages click-datetime 0.2
/usr/local/lib/python2.7/dist-packages construct 2.8.21
/usr/local/lib/python2.7/dist-packages pyaudio 0.2.11
/usr/local/lib/python2.7/dist-packages tabulate 0.8.2
------------------------------------------- -------------- ------
これにより、を使用して、または使用せずにインストールしたパッケージを簡単に識別できますsudo
。
補足:パケットを1回経由でインストールする場合sudo
と1 回インストールしない場合は、一方が優先されるため、もう一方がリストされない(1つの場所のみが表示される)ことに気付きました。ローカルディレクトリの1つだけがリストに表示されると思います。これは改善される可能性があります。
pip
一度使用して終了するという唯一の目的があるためです。これは、動作が変化する可能性があるという問題のようです。
_internal
)であることを明確にすることを目的とした以前の内部コード再編成をキャッチする理由です。全体として、それは明らかに機能しますが、悪い習慣です。より良い代替案があり、いくつかはこの質問の他の回答にあります。
使用する以外に、仮想環境に卵黄をpip freeze
インストールしています。
conda install
で動作します:)
sys.modules
pip
)、pip.get_installed_distributions()
2番目の目的のために、コード例:
import pip
for package in pip.get_installed_distributions():
name = package.project_name # SQLAlchemy, Django, Flask-OAuthlib
key = package.key # sqlalchemy, django, flask-oauthlib
module_name = package._get_metadata("top_level.txt") # sqlalchemy, django, flask_oauthlib
location = package.location # virtualenv lib directory etc.
version = package.version # version number
system.modules
代わりに使っていますsys.modules
。
多くのアイデアがありますが、最初はこれら2つについて考えています。
ピップ
短所:常にインストールされるわけではない
ヘルプ( 'モジュール')
短所:コンソールへの出力; 壊れたモジュール(ubuntuを参照...)を使用すると、セグメンテーション違反が発生する可能性があります
基本的なライブラリを使用し、古いPython 2.xと互換性のある簡単なアプローチが必要です
そして私は光を見ます:listmodules.py
2.5のドキュメントソースディレクトリには、Pythonインストールで使用可能なすべてのモジュールをリストする小さなスクリプトがあります。
長所:
imp、sys、os、re、timeのみを使用
Python 1.5.2以降で実行するように設計されています
ソースコードは本当にコンパクトなので、バグの多いモジュールの例外リストを渡すなど、簡単にいじることができます(インポートしないでください)。
AWS Lambdaでデフォルトで利用できる特定のバージョンのパッケージを見つける必要がありました。私はこのページからのアイデアのマッシュアップでそうしました。私は後世のためにそれを共有しています。
import pkgutil
__version__ = '0.1.1'
def get_ver(name):
try:
return str(__import__(name).__version__)
except:
return None
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': [{
'path': m.module_finder.path,
'name': m.name,
'version': get_ver(m.name),
} for m in list(pkgutil.iter_modules())
#if m.module_finder.path == "/var/runtime" # Uncomment this if you only care about a certain path
],
}
私が発見したのは、提供されているboto3ライブラリが古く、コードが失敗しているのは私のせいではないということです。プロジェクトにboto3とbotocoreを追加する必要がありました。しかし、これがなければ、コードが悪いと思って頭を叩いていたでしょう。
{
"statusCode": 200,
"body": [
{
"path": "/var/task",
"name": "lambda_function",
"version": "0.1.1"
},
{
"path": "/var/runtime",
"name": "bootstrap",
"version": null
},
{
"path": "/var/runtime",
"name": "boto3",
"version": "1.9.42"
},
{
"path": "/var/runtime",
"name": "botocore",
"version": "1.12.42"
},
{
"path": "/var/runtime",
"name": "dateutil",
"version": "2.7.5"
},
{
"path": "/var/runtime",
"name": "docutils",
"version": "0.14"
},
{
"path": "/var/runtime",
"name": "jmespath",
"version": "0.9.3"
},
{
"path": "/var/runtime",
"name": "lambda_runtime_client",
"version": null
},
{
"path": "/var/runtime",
"name": "lambda_runtime_exception",
"version": null
},
{
"path": "/var/runtime",
"name": "lambda_runtime_marshaller",
"version": null
},
{
"path": "/var/runtime",
"name": "s3transfer",
"version": "0.1.13"
},
{
"path": "/var/runtime",
"name": "six",
"version": "1.11.0"
},
{
"path": "/var/runtime",
"name": "test_bootstrap",
"version": null
},
{
"path": "/var/runtime",
"name": "test_lambda_runtime_client",
"version": null
},
{
"path": "/var/runtime",
"name": "test_lambda_runtime_marshaller",
"version": null
},
{
"path": "/var/runtime",
"name": "urllib3",
"version": "1.24.1"
},
{
"path": "/var/lang/lib/python3.7",
"name": "__future__",
"version": null
},
...
私が発見したものも、彼らが公式に公開したものとは異なりました。これを書いている時点で:
- オペレーティングシステム– Amazon Linux
- AMI – amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
- Linuxカーネル– 4.14.77-70.59.amzn1.x86_64
- AWS SDK for JavaScript – 2.290.0 \
- SDK for Python(Boto 3)– 3-1.7.74 botocore-1.10.74
以下は、インストールされているモジュールのリストを返すpythonコードソリューションです。コードを簡単に変更して、バージョン番号を含めることができます。
import subprocess
import sys
from pprint import pprint
installed_packages = reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze']).decode('utf-8')
installed_packages = installed_packages.split('\r\n')
installed_packages = [pkg.split('==')[0] for pkg in installed_packages if pkg != '']
pprint(installed_packages)
pip list
Pythonプログラムから呼び出す方法を知りたい人は、次のように使用できます。
import pip
pip.main(['list]) # this will print all the packages
シェルから
ls site-packages
それが役に立たない場合は、これを行うことができます。
import sys
import os
for p in sys.path:
print os.listdir( p )
そして、それが生み出すものを見てください。