我想获取 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 第二个示例中缺少,因为工作目录包含 behavesetup.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我已经在我的虚拟环境中安装蛋黄

  1. 要获取所有可用模块,请运行 sys.modules
  2. 得到所有 已安装 模块(阅读:安装者 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

该解决方案主要基于模块 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 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*******************************)

在情况下,必须安装,也可以使用一个水蟒蟒分布

$conda list

在除了上述的解决方案。

<强> 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


enter image description here

尝试这些

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 )

和看到产生什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top