列出已安装的 python 站点包? [复制]

Posted

技术标签:

【中文标题】列出已安装的 python 站点包? [复制]【英文标题】:Listing installed python site-packages? [duplicate] 【发布时间】:2011-01-19 00:54:17 【问题描述】:
from distutils.sysconfig import get_python_lib; print get_python_lib()

返回:/usr/lib/python2.6/site-packages

import sys; print sys.path

返回:['', '/usr/lib/python2.6/site-packages/Django-1.1.1-py2.6.egg', '/usr/lib/python2.6/site-packages/pip-0.6.3-py2.6.egg', '/usr/lib/python2.6/site-packages/TRML2PDF-1.0-py2.6.egg', '/usr/lib/python2.6/site-packages/django_threaded_multihost-1.3_3-py2.6.egg',...............

但是如何从安装的站点包中列出“可导入名称”?例如:(导入结果前)django, pip, trm2pdf....

谢谢。

【问题讨论】:

忽略我的近距离投票:有很大的不同(读得太快) 你试过Stallion吗? 现在 Python 2 不受支持,需要 from distutils.sysconfig import get_python_lib; print(get_python_lib()) 【参考方案1】:

pip 适合这项工作,因为它是一个安装和管理 Python 包的工具。安装后你必须执行:

pip freeze

这将以 pips 要求格式输出包和版本信息(以后可以使用一个命令来安装这些包)。输出格式如下:

querystring-parser==1.0
raven==1.4.6
requests==0.14.2
scipy==0.10.1

【讨论】:

从 pip 1.3 开始有一个 list 命令。【参考方案2】:

查看yolk。

Yolk 是一个 Python 命令行工具和库,用于获取有关由 setuptools、easy_install 和 distutils (Python 2.5) 安装的包的信息以及用于查询 PyPI(Python 包索引,又名 The Cheese Shop)。

【讨论】:

很好!,如果我运行 yolk -l ...它会列出我:Django ...等等等。但正确的“可导入名称”是 django(小写)。那怎么样?【参考方案3】:

你想要sys.modules

import pprint, sys
pprint.pprint(sys.modules)

你可以从那里切片和切块。

【讨论】:

>>> import pprint, sys >>> pprint(sys.modules) Traceback(最近一次调用最后):文件“”,第 1 行,在 类型错误:'module ' 对象不可调用 试试pprint.pprint(sys.modules) 输出为:'UserDict': <module from>,....</module>好像不是安装的插件。 我不能代表 2.6,因为我在所有机器上运行 2.5.4。【参考方案4】:

您可以使用pkgutil。这会列出 /usr/lib/python2.6/site-packages 中的所有模块:(与 sys.modules 不同,这会列出模块而无需先导入它们)。

import pkgutil
print [name for module_loader,name,ispkg in
          pkgutil.walk_packages(['/usr/lib/python2.6/site-packages'])]

编辑: The docs 不列出 walk_packages。但是,pkgutilpkgutil.__all__ 中包含walk_packages。这意味着它是 pkgutil 的公共接口的一部分。您可以在 /usr/lib/python2.6/pkgutil.py 中的 walk_packages 或通过键入 help(pkgutil.walk_packages) 找到以下文档:

Definition: pkgutil.walk_packages(path=None, prefix='', onerror=None)
Docstring:
    Yields (module_loader, name, ispkg) for all modules recursively
    on path, or, if path is None, all accessible modules.

    'path' should be either None or a list of paths to look for
    modules in.

    'prefix' is a string to output on the front of every module name
    on output.

    Note that this function must import all *packages* (NOT all
    modules!) on the given path, in order to access the __path__
    attribute to find submodules.

    'onerror' is a function which gets called with one argument (the
    name of the package which was being imported) if any exception
    occurs while trying to import a package.  If no onerror function is
    supplied, ImportErrors are caught and ignored, while all other
    exceptions are propagated, terminating the search.

    Examples:

    # list all modules python can access
    walk_packages()

    # list all submodules of ctypes
    walk_packages(ctypes.__path__, ctypes.__name__+'.')

【讨论】:

需要来自上方的from distutils.sysconfig import get_python_lib; print get_python_lib(),而不是硬编码路径。 2.6太老了……【参考方案5】:

我不知道一个简单的方法。 Python 发行版(即已安装的东西,如 Django 1.3)可以有零个或多个 Python 模块、零个或多个 Python 包(即具有子模块的模块,而不是其他工具称为包的模块)、零个或多个脚本、零个或多个数据文件。如果您使用 pip 或 easy_install 安装,元数据文件将写入 egg-info 目录/文件/压缩目录中,因此工具可以遍历这些文件以显示为分发安装了哪些模块或包,但我不知道任何执行此操作的工具。

yolk 和 pip freeze 只会列出发行版(即使他们称它们为包),让您知道安装了什么版本,然后您可以升级或卸载它们。

检查 sys.modules 仅提供有关在当前 Python 会话期间导入的模块的信息。

因此,要知道在安装发行版后哪些模块可以在您的系统上导入,您必须对站点包和类似目录进行粗略检查,或者编写一些代码来遍历打包元数据文件并提取模块。这不适用于使用纯 distutils 安装的发行版。

这显然是不完美且令人困惑的;我们仍在进行 Python 打包。

顺便说一句,我可以问一下您的问题的用例是什么?通常,您安装一个发行版来使用它,并且告诉您要安装什么的相同文档会告诉您要导入什么。

【讨论】:

以上是关于列出已安装的 python 站点包? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何列出 python 中存在的库? [复制]

如何在不安装的情况下列出python库的依赖项? [复制]

如何在 Python 中列出所有已安装的包及其版本?

python [使用代码安装pip包]使用此脚本使用nothin而不是python代码安装python包,并列出已安装的包#

如何获取已安装的 python 库列表? [复制]

如何列出已为特定提交修改的文件? [复制]