我需要在python程序中获取所有变量,但我不允许运行该程序。但是,我可以通过从主程序调用它来运行它并分析局部变量。
答案 0 :(得分:4)
ast
是你的朋友。它允许您利用实际的Python解析器,但实际上并不执行解析的代码。
也就是说,这只会给你一阶近似 - 因为Python允许动态创建变量,静态分析无法预测所有变量创建的100%。
答案 1 :(得分:3)
你不能这样做。 Python程序中的变量取决于执行路径。它们都是动态实例化的。例如。
if path == 0:
x = 1
else:
z = 1
w = 2
让我们说path
是从文件或用户读出的东西。你能指定执行这个块后定义的变量数量吗?
更具病态的情况就是这样
if path == 0:
locals()['x'] = 1
这将创建一个局部变量x
,但它使用赋值语句,因此您甚至无法使用ast
模块捕获它。
答案 2 :(得分:1)
如果我错了,请纠正我,但我会说任何有AST的事情都可能在这里过度杀伤。不是任何出现在赋值语句左侧的变量吗?
似乎“变量”是可以绑定值的标识符的特定实例。在Python执行模型的上下文中,这些被称为“对象”,它们被绑定到“名称”。
如果名称绑定在块中,则它是该块的局部变量。 如果名称在模块级别绑定,则它是全局变量。 (该 模块代码块的变量是本地的和全局的。)如果是 变量在代码块中使用但在那里没有定义,它是免费的 变量
这是甜蜜的东西(我的重点):
以下构造将名称:形式参数绑定到函数, 导入语句,类和函数定义(这些绑定 定义块中的类或函数名称)和目标 标识符出现在分配, for loop 标题中 除了子句标题的第二个位置,或者在 with 之后的第二个位置 声明。来自... import *的表单的import语句绑定 导入模块中定义的所有名称,除了那些以 一个下划线。此表单只能在模块级别使用。
所以,如果你可以覆盖这些基础,你就定了! :)
我认为你用这个分析的任何代码都是相当基本的Python代码;否则你可能想要按照上面的建议选择AST。