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

时间:2009-04-11 12:34:18

标签: python module pip

我想获得一个Python模块列表,这些模块位于我的Python安装(UNIX服务器)中。

如何获得计算机中安装的Python模块列表?

32 个答案:

答案 0 :(得分:910)

help('modules')

在Python shell /提示符中。

答案 1 :(得分:554)

解决方案

从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']

范围

此解决方案适用于系统范围或虚拟环境范围,涵盖由setuptoolspip和(god forbideasy_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) $ 
setup.py克隆一个git repo
(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 && 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的{​​{1}}文件。

我在文档中找不到对此问题的任何引用。也许我会为它打开一个错误。

答案 2 :(得分:253)

现在,我尝试了这些方法,而且我得到了所宣传的内容:所有模块。

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

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

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

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。

答案 3 :(得分:79)

  • ipython中,您可以输入“import 标签”。

  • 在标准Python解释器中,您可以输入“help('modules')”。

  • 在命令行,您可以使用pydoc modules

  • 在脚本中,请致电pkgutil.iter_modules()

答案 4 :(得分:75)

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

pip list

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

答案 5 :(得分:61)

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

import sys as s
s.modules.keys()

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

对于所有内置模块,请使用:

s.modules

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

答案 6 :(得分:60)

在普通的shell中只需使用

pydoc modules

答案 7 :(得分:25)

从第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中也会或不会起作用,请告诉我。

答案 8 :(得分:24)

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

>>help('modules package')

答案 9 :(得分:18)

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

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

https://jsfiddle.net/newzy08/xpvt214o/372035/显示了所有可用的pip list选项,并提供了一些很好的示例。

答案 10 :(得分:15)

不管Pip版本如何

在您的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'

答案 11 :(得分:12)

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

为了能够在不安装X11的情况下列出所有模块,我将pydoc作为http-server运行,即:

pydoc -p 12345

然后可以将Safari定向到http://localhost:12345/以查看所有模块。

答案 12 :(得分:12)

使用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]

答案 13 :(得分:10)

在Windows上

,在cmd中输入

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

答案 14 :(得分:8)

除了使用pip freeze之外,我一直在我的虚拟环境中安装yolk

答案 15 :(得分:8)

这是受到亚当·马坦(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安装一个数据包而一次没有安装数据包时,则优先处理一个数据包,以便不列出另一个数据包(仅显示一个位置)。我相信只会列出本地目录中的一个。这可以改善。

答案 16 :(得分:7)

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

<强>解释

  1. sys.builtin_module_names - 命名所有内置模块(查看我的回答https://laravel.com/docs/5.4/eloquent-relationships#has-many-through
  2. pkgutil.iter_modules() - 返回有关所有可用模块的信息
  3. importlib.util.find_spec() - 返回有关导入模块的信息(如果存在)
  4. BuiltinImporter - 内置模块的导入器(here
  5. SourceFileLoader - 标准Python模块的导入程序(默认情况下具有扩展名* .py)(docs
  6. ExtensionFileLoader - 模块导入器docs(用C或C ++编写)
  7. 完整代码

    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*******************************)
    

答案 17 :(得分:7)

  1. 获取所有可用模块,运行sys.modules
  2. 获取所有已安装模块(阅读:由pip安装),您可以查看pip.get_installed_distributions()
  3. 出于第二个目的,示例代码:

    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
    

答案 18 :(得分:6)

这会有所帮助

在终端或IPython中,键入:

const _format = 'YYYY-MM-DD'
const _today = moment().format(_format)
  initialState = {
       [_today]: {disabled: true}
   }

this.state = {_markedDates: this.initialState}

然后

help('modules')

答案 19 :(得分:5)

如果您安装了anaconda python distribution,也可以使用

$conda list

除上述解决方案外。

答案 20 :(得分:4)

pip冻结这一切都找到了包,但是可以简单地编写以下命令来列出python包所在的所有路径。

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

答案 21 :(得分:3)

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

  

缺点:并非总是安装

帮助(“模块”)

  

cons:输出到控制台;模块损坏(请参阅ubuntu ...)会导致段错误

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

我看到了光:listmodules.py

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

优点:

  

仅使用 imp,sys,os,re,time

     

旨在在Python 1.5.2和更高版本上运行

     

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

答案 22 :(得分:3)

有很多方法可以给猫皮。

  • 最简单的方法是直接通过以下命令从外壳中使用pydoc函数:
    pydoc modules

  • 但是要获取更多信息,请使用名为pip-date的工具,该工具还会告诉您安装日期。
    pip install pip-date


enter image description here

答案 23 :(得分:2)

我需要找到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 \
  •   
  • SDK for Python(Boto 3)– 3-1.7.74 botocore-1.10.74
  •   

答案 24 :(得分:2)

尝试这些

pip list

pip freeze

答案 25 :(得分:1)

安装

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

答案 26 :(得分:1)

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

import subprocess
import sys

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]
print(installed_packages)

答案 27 :(得分:1)

pip install pip-chill 
pip-chill

答案 28 :(得分:0)

对于想知道如何从Python程序调用{​​{1}}的人,您可以使用以下代码:

pip list

答案 29 :(得分:0)

如果上述方法均无济于事,则说明我的环境无法进行系统升级,因此无法升级pip。虽然它不会给您准确的列表,但您可以通过查看env> lib> python(version此处)> site-packages>来了解安装了哪些库。在这里,您会很好地了解已安装的模块。

答案 30 :(得分:-1)

对于过时的模块,请尝试(windows)

pip list --outdated

答案 31 :(得分:-8)

来自shell

ls site-packages

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

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

看看它产生了什么。