Я пишу программу, которая классифицирует список файлов Python, по которым импортируются модули. Поэтому мне нужно сканировать коллекцию файлов .py и возвращать список модулей, которые они импортируют. Например, если один из импортируемых мной файлов имеет следующие строки:
import os
import sys, gtk
Я бы хотел вернуть:
["os", "sys", "gtk"]
Я играл с modulefinder и писал:
from modulefinder import ModuleFinder
finder = ModuleFinder()
finder.run_script('testscript.py')
print 'Loaded modules:'
for name, mod in finder.modules.iteritems():
print '%s ' % name,
но это возвращает больше, чем просто модули, используемые в скрипте. В качестве примера в сценарии, который просто имеет:
import os
print os.getenv('USERNAME')
Модули, возвращаемые из скрипта ModuleFinder, возвращают:
tokenize heapq __future__ copy_reg sre_compile _collections cStringIO _sre functools random cPickle __builtin__ subprocess cmd gc __main__ operator array select _heapq _threading_local abc _bisect posixpath _random os2emxpath tempfile errno pprint binascii token sre_constants re _abcoll collections ntpath threading opcode _struct _warnings math shlex fcntl genericpath stat string warnings UserDict inspect repr struct sys pwd imp getopt readline copy bdb types strop _functools keyword thread StringIO bisect pickle signal traceback difflib marshal linecache itertools dummy_thread posix doctest unittest time sre_parse os pdb dis
... тогда как я просто хочу, чтобы он возвращал 'os', поскольку именно этот модуль использовался в скрипте.
Может ли кто-нибудь помочь мне достичь этого?
ОБНОВЛЕНИЕ : Я просто хочу уточнить, что я хотел бы сделать это без запуска анализируемого файла Python и только сканирования кода.