如何从编译的Python模块中获取函数名而不导入它?

时间:2014-06-02 21:01:14

标签: python

我正在创建一个intellisense类型模块,您可以在其中输入python代码并输出函数和变量名称的字典等。使用import将执行代码中的任何顶级语句,所以我会而不是使用它。相反,我使用ast模块。它适用于.py模块,但不适用于.pyc或.so模块,因为ast.parse()实际编译代码并且.so已经编译。那么有没有办法从编译模块中获取函数和变量名称和文档字符串而不使用import

[为清晰起见编辑]

# re module is .py
import ast, imp
file_object, module_path, description = imp.find_module('re')
src = file_object.read()
tree = ast.parse(source=src, filename=module_path, mode='exec')
for node in tree.body:
    print node

# datetime module is .so
file_object, module_path, description = imp.find_module('datetime')
src = file_object.read()
tree = ast.parse(source=src, filename=module_path, mode='exec')
for node in tree.body:
    print node


 File "test_ast.py", line 12, in <module>
   tree = ast.parse(source=src, filename=module_path, mode='exec')
 File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py", line 37, in parse
   return compile(source, filename, mode, PyCF_ONLY_AST)
TypeError: compile() expected string without null bytes

1 个答案:

答案 0 :(得分:1)

对于C扩展,您没有其他选择,只能导入它们并使用内省。

Komodo的CodeIntel使用从模块生成的单独数据文件(使用内省)或手动编写,例如为C扩展提供自动完成元数据。然后,他们的自动填充程序使用此静态数据。

CodeIntel项目是开源代码;请参阅http://community.activestate.com/faq/codeintel-cix-schemahttp://community.activestate.com/faq/generate-python-api-catalog获取灵感,和/或研究the source code of the toolset