题
我想获取 Python 模块的列表,这些模块位于我的 Python 安装(UNIX 服务器)中。
如何获取计算机中安装的 Python 模块的列表?
解决方案
解决方案
不要与 pip > 10.0 一起使用!
我花 50 美分买一个 pip freeze
来自 Python 脚本的类似列表:
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
和 (上帝禁止) 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 存储库安装 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
文件。
我在文档中找不到任何对此问题的引用。也许我应该为它打开一个错误。
其他提示
help('modules')
在Python壳/提示符。
现在,这些方法我试过了我自己,我有什么做了广告:所有模块
。唉,真的是你不那么在意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
我说:“令人惊讶”,因为包安装工具是一个希望找到此功能的确切地点,虽然没有在名称“冻结”,但蟒蛇包装是如此怪异,那我大吃一惊,这个工具是有道理的。皮普0.8.2,Python 2.7版。
在
ipython
你可以输入“import
标签".在标准 Python 解释器中,您可以输入“
help('modules')
".在命令行中,您可以使用
pydoc
modules
.在脚本中调用
pkgutil.iter_modules()
.
由于PIP 1.3版,您就可以访问:
pip list
这似乎是为“PIP冻结”语法糖。它会用自己的版本号列出所有特别安装或virtualenv中的模块,沿。不幸的是它不显示任何模块的当前版本号,也不会洗碟或闪耀鞋子。
我只是用这个看当前使用的模块:
import sys as s
s.modules.keys()
其示出了上你的Python运行的所有模块。
有关的所有内置模块使用:
s.modules
其是含有所有的模块和导入对象的字典。
在正常壳只是使用
pydoc modules
作为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的早期版本中工作了。
如果我们需要列出已安装的软件包在Python壳,我们可以按如下方式使用help
命令
>>help('modules package')
我通常使用pip list
拿到包的列表(版本)。
这个工作在虚拟环境中也是如此,当然。要显示什么安装只在虚拟环境(不是全球性包),使用pip list --local
。
这里的示出所有可用的选项pip list
文档,与几个很好的例子
非常简单的搜索使用 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]
我跑进在OS X上的自定义安装蟒2.7它需要X11列出安装的模块(包括使用的帮助和是pydoc)。
要能够列出的所有模块,而无需安装X11我跑是pydoc为http服务器,即:
pydoc -p 12345
然后,它能够直接地Safari浏览器http://localhost:12345/
看到所有模块。
的窗口上,在CMD输入此
c:\python\libs>python -m pip freeze
这是由亚当马滩的回答(接受的一个)的启发:
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
一次,一次安装一个分组而不,一个优先,使得另一个未被列出(仅示出一个位置)。我认为,只有一个在本地目录,然后上市。这可以改善。
除了使用pip freeze
我已经在我的虚拟环境中安装蛋黄。
- 要获取所有可用模块,请运行
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
该解决方案主要基于模块 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冷冻强>它所有的发现包但是可以简单地编写以下命令,列出其中蟒包的所有路径。
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
有很多想法,起初我琢磨这两个:
<强> PIP 强>
缺点:不总是安装
帮助( '模块')强>
缺点:输出到控制台;用碎模块(见的ubuntu ...)可段错误
我需要一种简单的方法,使用基本库和与旧蟒2.x的兼容
和我看到的光: listmodules.py
在2.5中的文档源目录隐藏是列出所有可用的模块用于Python安装一个小的脚本。
优点:
仅使用 IMP,SYS,锇,铼,时间
设计成关于Python 1.5.2和运行新的
源代码是真的紧凑,所以你可以很容易与它修修补补,例如通过的马车模块例外列表(不要试图将其导入)
给猫剥皮的方法有很多种。
最简单的方法是使用
pydoc
直接从 shell 运行:
pydoc modules
但要了解更多信息,请使用名为的工具 点日期 它还会告诉您安装日期。
pip install pip-date
尝试这些
pip list
或
pip freeze
我需要查找 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
对于任何人想知道如何从您可以使用下面的Python程序调用pip list
:
import pip
pip.main(['list]) # this will print all the packages
这将帮助
在终端或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
从壳
ls site-packages
如果这没有帮助,你可以做到这一点。
import sys
import os
for p in sys.path:
print os.listdir( p )
和看到产生什么。