如何获取本地安装的Python模块列表?

如何在我的计算机上安装Python模块列表?

1637501 次浏览

从贝壳

ls site-packages

如果这没有帮助,你可以这样做。

import sysimport osfor p in sys.path:print os.listdir( p )

看看它会产生什么。

help('modules')

在Python shell/提示符中。

现在,我自己尝试了这些方法,我得到了所宣传的:所有模块。

唉,你真的不太关心stdlib,你知道你从python安装中得到了什么。

真的,我想要安装的东西。

实际上,令人惊讶的是,工作得很好是:

pip freeze

返回:

Fabric==0.9.3apache-libcloud==0.4.0bzr==2.3b4distribute==0.6.14docutils==0.7greenlet==0.3.1ipython==0.10.1iterpipes==0.4libxml2-python==2.6.21

我说“令人惊讶”是因为软件包安装工具正是人们期望找到此功能的地方,虽然不是以“冻结”的名义,但python包装是如此奇怪,我很惊讶这个工具是有意义的。Pip 0.8.2,Python 2.7。

使用pkgutil.iter_modules进行非常简单的搜索

from pkgutil import iter_modulesa=iter_modules()while True:try: x=a.next()except: breakif 'searchstr' in x[1]: print x[1]

我只是用它来查看当前使用的模块:

import sys as ss.modules.keys()

它显示了在您的python上运行的所有模块。

对于所有内置模块使用:

s.modules

这是一个包含所有模块和导入对象的字典。

我在OS X上遇到了一个自定义安装的python 2.7。它需要X11列出已安装的模块(使用帮助和pydoc)。

为了能够在不安装X11的情况下列出所有模块,我将pydoc作为超文本传输协议-server运行,即:

pydoc -p 12345

然后可以将Safarihttp://localhost:12345/以查看所有模块。

除了使用pip freeze,我一直在我的虚拟环境中安装蛋黄

从pip 1.3版开始,您可以访问:

pip list

这似乎是“pip冻结”的语法糖。它会列出所有特定于您的安装或虚拟环境的模块,以及它们的版本号。不幸的是,它不会显示任何模块的当前版本号,也不会洗碗或擦鞋。

在普通shell中只需使用

pydoc modules

如果您安装了蟒蛇分布,您也可以使用

$conda list

除了上述解决方案。

如果我们需要在Python shell中列出已安装的包,我们可以使用help命令,如下所示

>>> help('modules package')
  1. 要获取所有可用模块,请运行sys.modules
  2. 要获取所有安装模块(阅读:由pip安装),您可以查看pip.get_installed_distributions()

对于第二个目的,示例代码:

import pipfor package in pip.get_installed_distributions():name = package.project_name # SQLAlchemy, Django, Flask-OAuthlibkey = package.key # sqlalchemy, django, flask-oauthlibmodule_name = package._get_metadata("top_level.txt") # sqlalchemy, django, flask_oauthliblocation = package.location # virtualenv lib directory etc.version = package.version # version number

解决方案

不要使用pip>10.0!

我的50美分用于从Python脚本中获取类似pip freeze的列表:

import pipinstalled_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']

范围

此解决方案适用于系统范围或虚拟环境范围,并涵盖由setuptoolspip和(上帝禁止easy_install安装的包。

我的用例

我将此调用的结果添加到我的flask服务器,因此当我使用http://example.com/exampleServer/environment调用它时,我将获得安装在服务器虚拟环境中的包列表。它使调试变得容易得多。

警告

我注意到这种技术的一个奇怪行为——当Python解释器在与setup.py文件相同的目录中调用时,它没有列出setup.py安装的包。

复制步骤:

创建虚拟环境
$ cd /tmp$ virtualenv test_envNew python executable in test_env/bin/pythonInstalling setuptools, pip...done.$ source test_env/bin/activate(test_env) $
setup.py克隆一个git repo
(test_env) $ git clone https://github.com/behave/behave.gitCloning 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.

我们在/tmp/behave中有行为setup.py

(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.eggFinished 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,因为工作目录包含behavesetup.py文件。

我在留档中找不到任何有关这个问题的资料,或许我可以bug。

在windows上,在cmd中输入这个

c:\python\libs>python -m pip freeze

点冻结完成了所有查找包的工作,但是可以简单地编写以下命令来列出python包所在的所有路径。

>>> import site; site.getsitepackages()['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

此解决方案主要基于模块importlibpkgutil,并与CPython 3.4和CPython 3.5一起使用,但不支持CPython 2。


补充说明

  1. sys.builtin_module_names-命名所有内置模块(看看我的答案这里
  2. pkgutil.iter_modules()-返回所有可用模块的信息
  3. importlib.util.find_spec()-如果存在,则返回有关导入模块的信息
  4. BuiltinImporter-内置模块的导入器(文档
  5. SourceFileLoader-标准Python模块的导入器(默认扩展名为*. py)(文档
  6. ExtensionFileLoader-模块的导入器共享库(写在C或C++上)

完整代码

import sysimport osimport shutilimport pkgutilimport importlibimport 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 modulesloaders = collections.OrderedDict()
# names`s of build-in modulesfor module_name in sys.builtin_module_names:
# find an information about a module by namemodule = importlib.util.find_spec(module_name)
# add a key about a loader in the dict, if not exists yetif module.loader not in loaders:loaders[module.loader] = []
# add a name and a location about imported module in the dictloaders[module.loader].append((module.name, module.origin))
# all available non-build-in modulesfor module_name in pkgutil.iter_modules():
# ignore this moduleif this_module_name == module_name[1]:continue
# find an information about a module by namemodule = importlib.util.find_spec(module_name[1])
# add a key about a loader in the dict, if not exists yetloader = type(module.loader)if loader not in loaders:loaders[loader] = []
# add a name and a location about imported module in the dictloaders[loader].append((module.name, module.origin))
# pretty printline = '-' * shutil.get_terminal_size().columnsfor 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 10开始,接受的答案将不再有效。开发团队已删除了对get_installed_distributions例程的访问权限。setuptools中有一个替代函数可以做同样的事情。这是一个适用于pip 10的替代版本:

import pkg_resourcesinstalled_packages = pkg_resources.working_setinstalled_packages_list = sorted(["%s==%s" % (i.key, i.version)for i in installed_packages])print(installed_packages_list)

请让我知道它是否会在以前版本的pip中工作。

我通常使用pip list来获取包列表(带版本)。

当然,这也适用于虚拟环境。要显示仅在虚拟环境中安装的内容(而不是全局包),请使用pip list --local

这是留档显示了所有可用的pip list选项,以及几个很好的示例。

有很多想法,最初我在思考这两个:

pip

缺点:不总是安装

help('模块')

缺点:输出到控制台;有损坏的模块(参见ubuntu…)可以分段故障

我需要一个简单的方法,使用基本的库并与旧的python 2. x兼容

我看到了光:listmodules.py

隐藏在2.5的留档源目录中的是一个小脚本,它列出了Python安装的所有可用模块。

优点:

仅使用imp, sys, os, re,时间

设计用于在Python 1.5.2及更高版本上运行

源代码非常紧凑,因此您可以轻松修补它,例如传递错误模块的异常列表(不要尝试导入它们)

警告:Adam Matan不鼓励在pip>10.0中使用这种方法。另外,请阅读下面@sinoroc的评论

这是由Adam Matan的回答(公认的)启发的:

import tabulatetry:from pip import get_installed_distributionsexcept: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安装数据包一次,一次没有安装时,一个优先,所以另一个没有被列出(只显示了一个位置)。我相信只有本地目录中的一个被列出。这可以改进。

有很多方法可以给猫剥皮。

  • 最简单的方法是直接从shell中使用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},...

我发现的也与他们正式发布的内容不同。在写这篇文章的时候:

  • 操作系统-亚马逊Linux
  • AMI-amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
  • Linux内核-4.14.77-70.59.amzn1.x86_64
  • 适用于JavaScript的AWS SDK-2.290.0\
  • Python SDK(Boto 3)-3-1.7.74 botocore-1.10.74

试试这些

pip list

pip freeze

对于任何想知道如何从Python程序调用pip list的人,您可以使用以下内容:

import pippip.main(['list])  # this will print all the packages

这会有帮助

在终端或IPython中,键入:

help('modules')

然后

In [1]: import                      #import press-TABDisplay all 631 possibilities? (y or n)ANSI                   audiodev               markupbaseAptUrl                 audioop                markupsafeArgImagePlugin         avahi                  marshalBaseHTTPServer         axi                    mathBastion                base64                 md5BdfFontFile            bdb                    mhlibBmpImagePlugin         binascii               mimetoolsBufrStubImagePlugin    binhex                 mimetypesCDDB                   bisect                 mimifyCDROM                  bonobo                 mmapCGIHTTPServer          brlapi                 mmkeysCanvas                 bsddb                  modulefinderCommandNotFound        butterfly              multifileConfigParser           bz2                    multiprocessingContainerIO            cPickle                musicbrainz2Cookie                 cProfile               mutagenCrypto                 cStringIO              mutexCurImagePlugin         cairo                  mxDLFCN                  calendar               netrcDcxImagePlugin         cdrom                  newDialog                 cgi                    nisDiscID                 cgitb                  nntplibDistUpgrade            checkbox               ntpath

安装

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

样品输出:

multiprocessingnetrcnntplibntpathnturl2pathnumbersopcodepicklepickletoolspipespkgutil

这是一个python代码解决方案,它将返回已安装模块的列表。可以轻松修改代码以包含版本号。

import subprocessimport sysfrom 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版本

在Python编辑器或IPython中运行以下内容:

import pkg_resourcesinstalled_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

如果在那里工作,!pip list将在您的jupyter笔记本中运行,简化了“快速检查”与grep等其他实用程序结合使用(如果您已安装)pip list | grep pandas 将获取您当前的熊猫版本,例如

如果以上所有似乎都没有帮助,那么在我的环境中,系统升级中断了,我无法升级pip。虽然它不会给你一个准确的列表,但你可以通过查看你的env>lib>python(此处的版本)>site-包>来了解安装了哪些库。在这里你会得到安装模块的良好指示。

pip install pip-chillpip-chill
pip3 freeze

全局运行此命令-将显示所有全局安装在虚拟环境上运行此命令-将向您显示所有本地安装

我正在比较方法来检索已安装的“模块”,所有这些我都在这个线程中看到过

iter_moduleshelp(“模块”)builtin_module_namespip列表working_set
包括分配✔️✔️
包括模块(无内置)✔️✔️
包括内置模块✔️✔️
包括冷冻✔️✔️
包括venv✔️✔️✔️✔️
包括全球✔️✔️✔️✔️
包括可编辑的安装✔️✔️✔️✔️
包括PyCharm助手✔️
降低大写字母✔️
耗时(共665个模块)53.7毫秒1.03秒577纳秒284毫秒36.2使用c

总结

  • pip listworking_set用于分布,而不是模块。
  • iter_moduleshelp("modules")非常相似,最大的区别是iter_modules不包括内置。
  • pip listworking_set非常相似,唯一的区别是working_set降低了所有大写字母。
  • 内置模块仅包含在help("modules")builtin_module_names中。

相关注意事项

  • 发行版、包和模块通常具有相同的名称,因此很容易将它们误认为是另一个。
  • importlib.util.find_spec用于模块,区分大小写。
  • sys.modules只列出导入的模块。

分布

我说分发而不是包,因为我认为它会减少误解。一个发行版/包可以有多个包/模块在里面。

已安装的发行版并不总是可以以相同的名称导入。例如pip install Pillowimport PIL一起导入。有时一个发行版甚至可以导入多个模块。

方法(按顺序排列)

iter_modules

import pkgutil{module.name for module in pkgutil.iter_modules()}

help("模块")(仅在终端打印)

help("modules")

builtin_module_names

import sysset(sys.builtin_module_names)

pip列表(仅在终端打印)

pip list终端

working_set

import pkg_resources{pkg.key for pkg in pkg_resources.working_set}

结论

import sysimport pkgutil
def get_installed_modules_names():iter_modules = {module.name for module in pkgutil.iter_modules()}builtin = sys.builtin_module_namesreturn set.union(iter_modules, builtin)