2010-02-20 50 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包裝。

順便說一句,我可以問你的問題是什麼用例?通常情況下,您安裝一個發行版以對其執行某些操作,而指示您要安裝的文檔將告訴您要導入的內容。