有没有办法在python脚本中获取所有变量的值?

有没有办法在python脚本中获取所有变量的值?,python,parsing,python-2.7,Python,Parsing,Python 2.7,如果这个问题超出范围,请建议我可以把它移到哪里 我有很多python(版本2.7)脚本,它们相互调用。获取哪个脚本的视图 调用,我目前已经构建了一个很好的GUI树来映射它 我的问题在于解析文件。脚本调用另一个脚本的最简单示例是调用: os.system('another.py') 这是很容易解析的,只需获取括号内的内容即可。我现在来评估变量。 我目前评估变量的方法如下: x = 'another' dot = '.' py = 'py' os.system(x+dot+py) # Find t

如果这个问题超出范围,请建议我可以把它移到哪里

我有很多python(版本2.7)脚本,它们相互调用。获取哪个脚本的视图 调用,我目前已经构建了一个很好的GUI树来映射它

我的问题在于解析文件。脚本调用另一个脚本的最简单示例是调用:

os.system('another.py')
这是很容易解析的,只需获取括号内的内容即可。我现在来评估变量。 我目前评估变量的方法如下:

x = 'another'
dot = '.'
py = 'py'
os.system(x+dot+py) # Find three variables

listOfVars = getVarsBetweenParenthesis() # Pseudo code.

# Call getVarValue to find value for every variable, then add these together 

'''
    Finds the value of a variable.
'''
def getVarValue(data, variable, stop):
    match = ''
    for line in data:
        noString = line.replace(' ', '') # Remove spaces
        if variable+'=' in noString:
            match = line.replace(variable+'=', '').strip()
        if line == stop:
            break
    return match
除了是一个丑陋的黑客,这个代码也有它的缺点。在做这些事情的时候
调用getVarValue查找每个变量的值,然后将这些值相加
并非所有变量都能得到它们所需的值。 例如:

x = os.getcwd() # Cannot be found by getVarValue
script = 'x.py'
os.system(x+script) # Find three variables
问题是我不想调用这些脚本(一些脚本创建/更新文件),而是按值解析它们。 由于python解释器能够解析脚本,我认为这是可能的

我已经看过了,这给了我一点帮助,还有。 但是,这两种方法似乎都无法在不运行文件的情况下解析变量

有没有一种方法(最好是pythonic)可以在不执行脚本的情况下检索变量值?

根据此方法进行修改这里是一个使用ast模块提取变量的示例

可以修改它以提取所有变量,但是
ast.literal\u eval
只能计算简单类型

def safe_eval_var_from_file(mod_path, variable, default=None, raise_exception=False):
    import ast
    ModuleType = type(ast)
    with open(mod_path, "r") as file_mod:
        data = file_mod.read()

    try:
        ast_data = ast.parse(data, filename=mod_path)
    except:
        if raise_exception:
            raise
        print("Syntax error 'ast.parse' can't read %r" % mod_path)
        import traceback
        traceback.print_exc()

    if ast_data:
        for body in ast_data.body:
            if body.__class__ == ast.Assign:
                if len(body.targets) == 1:
                    print(body.targets[0])
                    if getattr(body.targets[0], "id", "") == variable:
                        try:
                            return ast.literal_eval(body.value)
                        except:
                            if raise_exception:
                                raise
                            print("AST error parsing %r for %r" % (variable, mod_path))
                            import traceback
                            traceback.print_exc()
    return default

# example use
this_variable = {"Hello": 1.5, 'World': [1, 2, 3]}
that_variable = safe_eval_var_from_file(__file__, "this_variable")
print(this_variable)
print(that_variable)

考虑一下您的问题:如果一个变量的值在脚本执行后发生变化,您希望显示什么?初始值还是计算值?我不确定,但您是否尝试过monkeypatching
os.system
?类似这样的东西:
os.system=lambda script\u name:send\u script\u name\u to\u where\u you\u collect\u(script\u name
@BurhanKhalid:Hmm,好问题!我想找到所有值,这样我就可以找到所有被调用的脚本。@J0HN没有想到,谢谢:)如果我想为比os.system更多的模块这么做,我得把所有的模块都装上补丁,对吗?是的。此外,您可能希望跟踪修补的内容,并在某个时候将其恢复为原始值。