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()
21 回答
从第10点开始,接受的答案将不再适用 . 开发团队已删除对
get_installed_distributions
例程的访问权限 .setuptools
中有一个替代功能,用于执行相同的操作 . 这是与pip 10一起使用的替代版本:如果它在以前版本的pip中有效或不可用,请告诉我 .
使用pkgutil.iter_modules非常简单的搜索
有很多想法,最初我在思考这两个:
pip
help('modules')
我需要一个简单的方法,使用基本库并兼容旧的python 2.x.
我看到了光明:listmodules.py
隐藏在2.5中的文档源目录中的是一个小脚本,它列出了Python安装的所有可用模块 .
优点:
在Windows上,在cmd中输入
解决方案
从Python脚本中获取类似
pip freeze
的列表,我只需50美分:作为(太长)一个班轮:
赠送:
范围
此解决方案适用于系统范围或虚拟环境范围,并涵盖由
setuptools
,pip
和(god forbid)easy_install
安装的软件包 .我的用例
我将此调用的结果添加到我的烧瓶服务器,所以当我用
http://example.com/exampleServer/environment
调用它时,我得到服务器的virtualenv上安装的软件包列表 . 它使调试变得更加容易 .警告
我注意到这种技术的奇怪行为 - 当在与
setup.py
文件相同的目录中调用Python解释器时,它不会列出由setup.py
安装的包 .重现步骤:
创建虚拟环境
使用
setup.py
克隆git仓库我们在
/tmp/behave
中表现为setup.py
:从git repo
安装python包
如果我们从/ tmp运行上述解决方案
如果我们从/ tmp / behave运行上述解决方案
第二个示例中缺少
behave==1.2.5a1
,因为工作目录包含behave
的setup.py
文件 .我在文档中找不到任何对此问题的引用 . 也许我会为它打开一个错误 .
除了使用
pip freeze
,我一直在我的虚拟环境中安装yolk .pip freeze 这一切都找到了包,但是可以简单地编写以下命令来列出python包所在的所有路径 .
如果你安装了anaconda python distribution,你也可以使用
除了上述解决方案 .
我在OS X上遇到了一个自定义安装的python 2.7 . 它需要X11来列出安装的模块(使用help和pydoc) .
为了能够在不安装X11的情况下列出所有模块,我将pydoc作为http-server运行,即:
然后可以将Safari指向
http://localhost:12345/
以查看所有模块 .在ipython中,您可以输入“
import
Tab” .在标准Python解释器中,您可以键入“
help('modules')
” .在命令行中,您可以使用pydoc
modules
.在脚本中,调用pkgutil.iter_modules() .
我只是用它来查看当前使用的模块:
它显示了在python上运行的所有模块 .
对于所有内置模块,请使用:
哪个是包含所有模块和导入对象的dict .
如果我们需要在Python shell中列出已安装的软件包,我们可以使用
help
命令,如下所示现在,我尝试了这些方法,并且我得到了所宣传的内容:所有模块 .
唉,你真的不太关心stdlib,你知道你用python安装得到了什么 .
真的,我想要我安装的东西 .
实际上,令人惊讶的是,工作得很好的是:
返回的是:
我说“令人惊讶”,因为软件包安装工具是人们期望找到这个功能的确切位置,虽然不是名为'freeze'但python包装是如此奇怪,我很惊讶这个工具是有道理的 . Pip 0.8.2,Python 2.7 .
在Python shell /提示符下 .
在正常的shell中使用
从壳
如果这没有帮助,你可以这样做 .
看看它产生了什么 .
从pip 1.3版开始,您就可以访问:
这似乎是“pip冻结”的语法糖 . 它将列出特定于您的安装的所有模块或virtualenv,以及他们的版本号 . 不幸的是,它没有显示任何模块的当前版本号,也没有洗碗或擦鞋 .
获取所有可用模块,运行
sys.modules
获取所有已安装的模块(读取:由
pip
安装),您可以查看pip.get_installed_distributions()
为了第二个目的,示例代码:
我通常使用
pip list
来获取包列表(带有版本) .当然,这也适用于虚拟环境 .
此解决方案主要基于模块
importlib
和pkgutil
,并与CPython 3.4和CPython 3.5一起使用,但不支持CPython 2 .Explanation
sys.builtin_module_names
- 命名所有内置模块(看我的答案here)pkgutil.iter_modules()
- 返回有关所有可用模块的信息importlib.util.find_spec()
- 返回有关导入模块的信息(如果存在)BuiltinImporter
- 内置模块的导入程序(docs)SourceFileLoader
- 标准Python模块的导入程序(默认情况下具有扩展名* .py)(docs)ExtensionFileLoader
- 模块的导入程序为shared library(写在C或C上)Full code
Usage
对于CPython3.5(截断)
对于CPython3.4(截断)
如果您使用的是Python 3
我刚试过Ubuntu,它似乎有效
Debian / Ubuntu:
sudo apt-get install python3-matplotlib
Fedora:
sudo dnf install python3-matplotlib
红帽:
sudo yum install python3-matplotlib
拱门:
sudo pacman -S python-matplotlib
资料来源:https://matplotlib.org/users/installing.html