关于django:列出安装的python站点包?

Listing installed python site-packages?

本问题已经有最佳答案,请猛点这里访问。


PIP是该工作的工具,因为它是安装和管理Python包的工具。安装后,必须执行:

1
pip freeze

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

1
2
3
4
querystring-parser==1.0
raven==1.4.6
requests==0.14.2
scipy==0.10.1


检查蛋黄。

Yolk is a Python command-line tool and library for obtaining information about packages installed by setuptools, easy_install and distutils (Python 2.5) and for querying PyPI (Python Package Index a.k.a. The Cheese Shop).


你要的是sys.modules

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

你可以从那里切、切。


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

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

编辑:单据上没有列出walk_packages。但是,pkgutil包括walk_packagespkgutil.__all__中。这意味着它是pkgutil公共接口的一部分。您可以在/usr/lib/python2.6/pkgutil.py中或通过键入EDOCX1[6]找到以下关于EDOCX1[1]的文档:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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__+'.')

我不知道一个简单的方法。python发行版(即已安装的产品,如django 1.3)可以有零个或多个python模块、零个或多个python包(即具有子模块的模块,而不是其他工具所称的包)、零个或多个脚本、零个或多个数据文件。如果安装了pip或easy-install,元数据文件将写入egg-info目录/files/zipped目录中,因此工具可以遍历这些文件来显示为分发安装了哪些模块或包,但我不知道有任何工具可以这样做。

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

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

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

这显然是不完美和混乱的;我们仍在研究Python打包。

顺便问一下,我能问一下您的问题的用例是什么?通常,您安装一个分发版来处理它,并且告诉您安装什么的相同文档将告诉您导入什么。