Как я могу получить доступ к списку модулей, которые отображаются в справке Python («модули»)? - PullRequest
4 голосов
/ 10 января 2012

Как получить доступ к списку модулей, отображаемых в Python help('modules')? Это показывает следующее:

>>> help('modules')

Please wait a moment while I gather a list of all available modules...

...[list of modules]...
MySQLdb             codeop              mailman_sf          spwd
OpenSSL             collections         markupbase          sqlite3
Queue               colorsys            marshal             sre
...[list of modules]...

Enter any module name to get more help.  Or, type "modules spam" to search
for modules whose descriptions contain the word "spam".

>>>

Я могу просмотреть список в выводе, но хотел бы получить к нему доступ в виде списка из программы Python. Как я могу это сделать?

Ответы [ 4 ]

4 голосов
/ 10 января 2012

Вы можете имитировать все, что help делает самостоятельно. Встроенный help использует pydoc, который использует класс ModuleScanner для получения информации обо всех доступных библиотеках - см. Строку 1873 в pydoc.py .

Вот немного измененная версия кода по ссылке:

>>> modules = []
>>> def callback(path, modname, desc, modules=modules):
    if modname and modname[-9:] == '.__init__':
        modname = modname[:-9] + ' (package)'
    if modname.find('.') < 0:
        modules.append(modname)

>>> def onerror(modname):
    callback(None, modname, None)

>>> from pydoc import ModuleScanner 
>>> ModuleScanner().run(callback, onerror=onerror)
>>> len(modules)
379
>>> modules[:10]
['__builtin__', '_ast', '_bisect', '_codecs', '_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', '_codecs_tw']
>>> len(modules)
379
2 голосов
/ 10 января 2012

Есть несколько способов. Вы можете попробовать:

import sys

mod_dict = sys.modules

for k,v in mod_dict.iteritems():
    print k,v
1 голос
/ 11 января 2012

Список модулей в конечном итоге получается из комбинации sys.builtin_module_names и вывода pkgutil.walk_packages :

import sys
from pkgutil import walk_packages

modules = set()

def callback(name, modules=modules):
    if name.endswith('.__init__'):
        name = name[:-9] + ' (package)'
    if name.find('.') < 0:
        modules.add(name)

for name in sys.builtin_module_names:
    if name != '__main__':
        callback(name)

for item in walk_packages(onerror=callback):
    callback(item[1])

for name in sorted(modules, key=lambda n: n.lower()):
    print name

Следует отметить, что создание списка приводит к тому, что все модули будут импортированы (вы можете легко убедиться в этом сами, проверив длину sys.modules до и после вызова help('modules')).

Еще одна вещь, на которую следует обратить внимание: вывод walk_packages зависит от текущего состояния sys.path, поэтому результаты могут не всегда совпадать с выводом help.

1 голос
/ 10 января 2012

В них будут перечислены только модули, не входящие в стандартную библиотеку, но может быть полезным,

subprocess.call ( pip freeze)

subprocess.call ( желток -1)

...