我想获取 Python 安装(UNIX 服务器)中的 Python 模块列表。
如何获取计算机中安装的 Python 模块列表?
help('modules')
在 Python 外壳/提示中。
从 Python 脚本中获取类似pip freeze
列表的 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 reposetup.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
文件。
我在文档中找不到对此问题的任何参考。也许我会为它打开一个错误。
现在,我自己尝试了这些方法,我得到了宣传的内容:所有模块。
唉,你真的不太关心标准库,你知道安装 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
我说“令人惊讶”是因为软件包安装工具正是人们期望找到此功能的确切位置,虽然不是以“冻结”的名义,但 python 打包是如此奇怪,以至于我惊讶于这个工具是有意义的。点 0.8.2,Python 2.7。
从 pip 1.3 版开始,您可以访问:
pip list
这似乎是“pip freeze”的语法糖。它将列出特定于您的安装或 virtualenv 的所有模块,以及它们的版本号。不幸的是,它不会显示任何模块的当前版本号,也不会洗碗或擦鞋。
ipython
你可以在里面输入“ import
Tab”。
在标准 Python 解释器中,您可以键入“ help('modules')
”。
在命令行中,您可以使用.pydoc
modules
在脚本中,调用pkgutil.iter_modules()
.
我只是用它来查看当前使用的模块:
import sys as s
s.modules.keys()
它显示了在你的 python 上运行的所有模块。
对于所有内置模块,请使用:
s.modules
这是一个包含所有模块和导入对象的字典。
在普通外壳中只需使用
pydoc modules
从 pip 10 开始,接受的答案将不再有效。开发团队已删除对get_installed_distributions
例程的访问权限。在 for 中有一个替代函数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。
如果我们需要在 Python shell 中列出已安装的包,可以使用help
如下命令
>>> help('modules package')
在您的 python 编辑器或 IPython 中运行以下命令:
import pkg_resources
installed_packages = {d.project_name: d.version for d in pkg_resources.working_set}
print(installed_packages)
阅读其他答案并将这个组合放在一起,这是Python中最快和最简单的。
然后,您可以方便地从您的字典中轻松获取项目,即
installed_packages['pandas']
>> '1.16.4'
!pip list
如果在那里工作,将在您的 jupyter 笔记本中运行,简化“快速检查”结合其他实用程序,如 grep(如果您已安装)
pip list | grep pandas
将获得您当前的 pandas 版本,例如
我通常pip list
用来获取软件包列表(带有版本)。
当然,这也适用于虚拟环境。要显示仅在虚拟环境(而不是全局包)中安装的内容,请使用pip list --local
.
这是显示所有可用pip list
选项的文档,并带有几个很好的示例。
在终端或 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
试试这些
pip list
或者
pip freeze
使用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]
on windows, Enter this in cmd
c:\python\libs>python -m pip freeze
我在 OS X 上遇到了自定义安装的 python 2.7。它需要 X11 列出已安装的模块(使用帮助和 pydoc)。
为了能够在不安装 X11 的情况下列出所有模块,我将 pydoc 作为 http-server 运行,即:
pydoc -p 12345
然后可以指示 Safarihttp://localhost:12345/
查看所有模块。
警告: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
.
顺便说一句:我注意到,当我安装一个数据包一次通过sudo
和一次不安装时,一个优先,因此另一个没有被列出(只显示一个位置)。我相信只有本地目录中的一个被列出。这可以改进。
此解决方案主要基于模块importlib
,pkgutil
可与 CPython 3.4 和 CPython 3.5 一起使用,但不支持 CPython 2。
解释
sys.builtin_module_names
- 命名所有内置模块(在这里查看我的答案)pkgutil.iter_modules()
- 返回有关所有可用模块的信息importlib.util.find_spec()
- 返回有关导入模块的信息(如果存在)BuiltinImporter
- 内置模块的导入器(文档)SourceFileLoader
- 标准 Python 模块的导入器(默认扩展名为 *.py)(文档)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 freeze
我一直在我的虚拟环境中安装蛋黄。
In case you have an anaconda python distribution installed, you could also use
$conda list
in addition to solutions described above.
sys.modules
pip
),您可以查看pip.get_installed_distributions()
对于第二个目的,示例代码:
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
给猫剥皮的方法有很多。
最简单的方法是pydoc
直接从 shell 中使用该函数:
pydoc modules
但要了解更多信息,请使用名为pip-date的工具,该工具还会告诉您安装日期。
pip install pip-date
pip freeze会全部查找包,但是可以简单地编写以下命令来列出 python 包所在的所有路径。
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
我需要在 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
},
...
我发现的也和他们官方公布的不一样。在撰写本文时:
- 操作系统 – 亚马逊 Linux
- AMI – amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
- Linux 内核 – 4.14.77-70.59.amzn1.x86_64
- 适用于 JavaScript 的 AWS 开发工具包 – 2.290.0\
- 适用于 Python 的 SDK (Boto 3) – 3-1.7.74 botocore-1.10.74
思路很多,最初我在琢磨这两个:
点子
缺点:并不总是安装
帮助('模块')
缺点:输出到控制台;模块损坏(请参阅 ubuntu ...)可能会出现段错误
我需要一种简单的方法,使用基本库并与旧的 python 2.x 兼容
我看到了曙光:listmodules.py
隐藏在 2.5 的文档源目录中的是一个小脚本,它列出了 Python 安装的所有可用模块。
优点:
仅使用imp、sys、os、re、time
设计为在 Python 1.5.2 和更新版本上运行
源代码非常紧凑,因此您可以轻松修改它,例如传递错误模块的异常列表(不要尝试导入它们)
这是一个 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 install pkgutil
代码
import pkgutil
for i in pkgutil.iter_modules(None): # returns a tuple (path, package_name, ispkg_flag)
print(i[1]) #or you can append it to a list
样本输出:
multiprocessing
netrc
nntplib
ntpath
nturl2path
numbers
opcode
pickle
pickletools
pipes
pkgutil
pip install pip-chill
pip-chill
如果上述方法似乎都没有帮助,那么在我的环境中,系统升级被破坏了,我无法升级 pip。虽然它不会为您提供准确的列表,但您只需查看 env>lib>python(version here)>site-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 )
看看会产生什么。