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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取本地安装的Python模块列表?相关的知识,希望对你有一定的参考价值。

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

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

答案

Do not use with pip > 10.0!

从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安装的软件包。

Steps to reproduce:

Create a virtual environment
$ 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

If we run the aforementioned solution from /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'

If we run the aforementioned solution from /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文件。

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

另一答案

我通常使用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:pythonlibs>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

另一答案
  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 - 命名所有内置模块(看我的答案here
  2. pkgutil.iter_modules() - 返回有关所有可用模块的信息
  3. importlib.util.find_spec() - 返回有关导入模块的信息(如果存在)
  4. BuiltinImporter - 内置模块的进口商(docs
  5. SourceFileLoader - 标准Python模块的导入程序(默认情况下具有扩展名* .py)(docs
  6. Exte

    以上是关于如何获取本地安装的Python模块列表?的主要内容,如果未能解决你的问题,请参考以下文章

    一旦单击带有 in 片段的回收器列表项,如何将片段意向活动,以及如何获取回收器项目值?

    如何获取由python模块导入的模块列表

    如何使用模块化代码片段中的LeakCanary检测内存泄漏?

    如何获取已安装 CPAN 模块的列表?

    如何使列表视图出现在片段中?

    如何将本地存储中的 JSON 对象添加到 Android Studio 上的片段列表