列出已安装的Python网站包?

16
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等。

谢谢。


请忽略我的关闭投票:这里有一个实质性的区别(我读得太快了)。 - ChristopheD
你尝试过 Stallion 吗? - Tarantula
现在Python 2已经不再受支持,因此需要使用from distutils.sysconfig import get_python_lib; print(get_python_lib()) - nealmcb
5个回答

15

pip 是用于安装和管理 Python 包的工具,非常适合这个工作。安装后需要执行以下命令:

pip freeze

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

<package1>==<version1>
<package2>==<version2>
...
querystring-parser==1.0
raven==1.4.6
requests==0.14.2
scipy==0.10.1

2
从pip 1.3开始,有一个名为list的命令。 - Piotr Dobrogost
在我的情况下,只能从代码编辑器终端运行...而不能在BASH中运行。 - Sebastian

7

请查看yolk

yolk是一个Python命令行工具和库,用于获取由setuptools、easy_install和distutils(Python 2.5)安装的软件包的信息,并查询PyPI(Python Package Index,也称为The Cheese Shop)。


不错!如果我运行 yolk -l ... 它会列出:Django...等等,但正确的“可导入名称”是django(小写)。那怎么办? - panchicore

5

你需要使用sys.modules

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

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

import pprint, sys pprint(sys.modules) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'module' object is not callable
- panchicore
3
尝试运行pprint.pprint(sys.modules)来输出模块信息。 - Ned Deily
输出是:<code>{'UserDict': <module 'UserDict' from '/usr/lib/python2.6/UserDict.pyc'>,....</code> 似乎不是已安装的插件。 - panchicore
我无法代表2.6,因为我在所有机器上都运行2.5.4。 - Peter Rowell

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'])]
编辑:文档没有列出 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() 来获取Python库的路径,而不是写死路径。2.6版本实在太老了... - nealmcb

0

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

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

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

因此,在安装分发后要知道系统上可导入哪些模块,您必须采用粗略的方式检查site-packages和类似目录,或编写一些代码来遍历打包元数据文件并提取模块。这对于使用纯distutils安装的分发无效。

这显然是不完美和令人困惑的;我们仍在致力于Python打包。

顺便问一下,你的问题有什么用例吗?通常情况下,你会安装一个发行版来完成某些任务,并且相同的文档会告诉你安装什么和需要导入什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接