我正在编写一个程序,它对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文件,只扫描代码的情况下执行此操作。
这取决于你想要多彻底。使用的模块是一个图灵完整的问题:一些python代码使用惰性导入只导入它们在特定运行中实际使用的东西,一些代码生成动态导入的东西(例如插件系统)。
python-v将跟踪import语句——这可以说是最简单的检查。
最好的方法是使用http://furius.ca/snakefood/包。作者已经完成了所有必需的工作,不仅获得了直接导入的模块,而且还使用AST来解析运行时依赖关系的代码,这将是一个更为静态的分析所忽略的。
制作了一个命令示例来演示:
它将生成每个唯一模块的基本依赖文件。更详细的使用:
要遍历树并查找所有导入,也可以在代码中执行此操作: 请注意-此例程的AST块是从具有此版权的snakefood源中提取的:版权所有(C)2001-2007 Martin Blais。保留所有权利。
您可能想尝试dis(双关语):
产出
导入的模块是
grouped['IMPORT_NAME']
。相关问题 更多 >
编程相关推荐