我想获得一个Python模块列表,这些模块在我的Python安装(UNIX服务器)中。
如何获得计算机中安装的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上安装的软件包列表。它使调试变得更加容易。
我注意到这种技术的奇怪行为 - 当在与setup.py
文件相同的目录中调用Python解释器时,它不会列出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) $
Clone a git repo with 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
Install the python package from the git repo
(test_env) $ cd /tmp/behave && python setup.py 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
文件。
我在文档中找不到任何对此问题的引用。也许我会为它打开一个错误。
我通常使用pip list
来获取包列表(带有版本)。
当然,这也适用于虚拟环境。要显示仅在虚拟环境(不是全局包)中安装的内容,请使用pip list --local
。
Here's documentation显示了所有可用的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上遇到了一个自定义安装的python 2.7。它需要X11来列出安装的模块(使用help和pydoc)。
为了能够在不安装X11的情况下列出所有模块,我将pydoc作为http-server运行,即:
pydoc -p 12345
然后可以将Safari导向http://localhost:12345/
以查看所有模块。
在Windows上,在cmd中输入
c:\python\libs>python -m pip freeze
这是受到Adam Matan的answer(被接受者)的启发:
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
,我一直在我的虚拟环境中安装yolk。
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
- 命名所有内置模块(看我的答案here)pkgutil.iter_modules()
- 返回有关所有可用模块的信息importlib.util.find_spec()
- 返回有关导入模块的信息(如果存在)BuiltinImporter
- 内置模块的进口商(docs)SourceFileLoader
- 标准Python模块的导入程序(默认情况下具有扩展名* .py)(docs)ExtensionFileLoader
- shared library模块的导入程序(用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完成所有查找包但是可以简单地编写以下命令来列出python包所在的所有路径。
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
help('modules')
在Python shell /提示符下。
有很多想法,最初我在考虑这两个:
果仁
缺点:并不总是安装
帮助(“模块”)
缺点:输出到控制台;破碎的模块(参见ubuntu ...)可以段错误
我需要一个简单的方法,使用基本库并兼容旧的python 2.x.
我看到了光:listmodules.py
隐藏在2.5中的文档源目录中的是一个小脚本,它列出了Python安装的所有可用模块。
优点:
仅使用imp,sys,os,re,time
旨在运行在Python 1.5.2及更高版本上
源代码非常紧凑,因此您可以轻松地修改它,例如传递错误模块的异常列表(不要尝试导入它们)
皮肤猫的方法有很多种。
pydoc
函数:
pydoc modules
pip install pip-date
我需要在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
},
...
我发现的也与what they officially publish不同。在撰写本文时:
- 操作系统 - Amazon 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
试试这些
pip list
要么
pip freeze
从壳
ls site-packages
如果这没有帮助,你可以这样做。
import sys
import os
for p in sys.path:
print os.listdir( p )
看看它产生了什么。
现在,我尝试了这些方法,并且我得到了所宣传的内容:所有模块。
唉,你真的不太关心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
我说“令人惊讶”,因为软件包安装工具是人们期望找到这个功能的确切位置,虽然不是名为'freeze',但python包装是如此奇怪,我很惊讶这个工具是有道理的。 Pip 0.8.2,Python 2.7。
ipython
,您可以输入“import
Tab”。help('modules')
”。pydoc
modules
。pkgutil.iter_modules()
。从pip 1.3版开始,您就可以访问:
pip list
这似乎是“pip冻结”的语法糖。它将列出特定于您的安装或virtualenv的所有模块及其版本号。不幸的是,它没有显示任何模块的当前版本号,也没有洗碗或擦鞋。
我只是用它来查看当前使用的模块:
import sys as s
s.modules.keys()
它显示了在python上运行的所有模块。
对于所有内置模块,请使用:
s.modules
哪个是包含所有模块和导入对象的dict。
在正常的shell中使用
pydoc modules
从第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 shell中列出已安装的软件包,我们可以使用help
命令,如下所示
>>help('modules package')