列出已安装的python site-packages?

时间:2010-02-20 02:24:32

标签: python django

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

感谢。

5 个答案:

答案 0 :(得分:11)

pip是工作的一部分,因为它是一个安装和管理Python包的工具。安装完成后,您必须执行:

pip freeze

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

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

答案 1 :(得分:7)

查看yolk

  

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

答案 2 :(得分:4)

您想要sys.modules

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

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

答案 3 :(得分:2)

您可以使用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。但是,pkgutilwalk_packages中包含pkgutil.__all__。这意味着它是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__+'.')

答案 4 :(得分:0)

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

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

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

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

这显然是不完美和令人困惑的;我们仍在开发Python包装。

顺便说一句,请问您的问题的用例是什么?通常情况下,您安装一个发行版来执行某些操作,并且相同的文档会告诉您要安装的内容。