2010-02-20 66 views
10
from distutils.sysconfig import get_python_lib; print get_python_lib() 

返回:/usr/lib/python2.6/site-packages列出已安装的python站点包?

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

但如何从安装在站点包列出了 “导入的名字”? E.g:(前导入结果)django, pip, trm2pdf....

感谢。

+0

忽略我的近距离投票:有一个实质性的差异(读得太快) – ChristopheD 2010-02-20 10:44:26

+0

你试过[Stallion](http://pyevolve.sourceforge.net/wordpress/?p=2200)? – Tarantula 2012-02-08 15:21:11

回答

7

退房yolk

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

+0

不错!如果我运行蛋黄-l ......它列出了我:Django ......等等。但正确的“可导入的名称”是django(小写)。那个怎么样? – panchicore 2010-02-20 02:38:06

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。但是,pkgutil包括walk_packagespkgutil.__all__。这意味着它是pkgutil的公共接口的一部分。您可以在/usr/lib/python2.6/pkgutil.py或键入help(pkgutil.walk_packages)找到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__+'.') 
3

你想sys.modules

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

你可以从那里切片和骰子。

+0

>>>进口pprint,SYS >>> pprint(sys.modules中) 回溯(最近通话最后一个): 文件 “”,1号线,在 类型错误: '模块' 对象不是可调用 – panchicore 2010-02-20 03:47:40

+3

尝试'pprint.pprint(sys.modules)' – 2010-02-20 05:22:14

+0

输出结果是:{'UserDict': ,....似乎不是安装的插件。 – panchicore 2010-02-20 19:29:07

10

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

pip freeze 

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

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

从pip 1.3开始,有一个[list](http://www.pip-installer.org/en/latest/usage.html#pip-list)命令。 – 2013-03-13 21:50:14

0

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

蛋黄和PIP冻结将只列出分布(即使他们打电话给他们包),让你知道正在安装的版本,然后就可以升级或卸载。

检查sys.modules中仅提供关于当前的Python会话过程中导入模块的信息。

所以知道什么模块安装后分配在系统上导入的,你不得不求助于站点包和类似目录的原油检查,或编写一些代码来走过去的打包元数据文件,并提取模块。这对于安装了纯粹distutils的发行版不起作用。

这显然不完美和令人困惑;我们仍在研究Python包装。

顺便说一句,我可以问你的问题是什么用例?通常情况下,您安装一个发行版以对其执行某些操作,而指示您要安装的文档将告诉您要导入的内容。