如何提取然后引用python模块中定义的变量?

Rob*_*arr 2 python variables import

我正在尝试为我公司的测试环境构建一个简单的环境检查脚本.我的目标是能够ping为给定测试环境实例定义的每个主机.主机在如下文件中定义:

#!/usr/bin/env python
host_ip = '192.168.100.10'
router_ip = '192.168.100.254'
fs_ip = '192.168.200.10'
Run Code Online (Sandbox Code Playgroud)

如何以可迭代的方式获取所有这些值(即我需要遍历并ping每个IP地址)?

我看过local()和vars(),但尝试做这样的事情:

for key, value in vars():
    print key, value
Run Code Online (Sandbox Code Playgroud)

生成此错误:

ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

我已经能够通过检查dir(local_variables)不包含'__'字符串的值来提取所有变量的名称,但是我有一个字符串列表,我无法弄清楚如何从字符串到达同名变量的值.

Gle*_*ard 8

首先,我强烈建议不要这样做.相反,做:

hosts = {
    "host_ip": '192.168.100.10',
    "router_ip": '192.168.100.254',
    "fs_ip": '192.168.200.10',
}
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地导入模块并正常引用它 - 这提供了一种从任何Python代码访问这些数据的普通标准方法:

import config
for host, ip in config.hosts.iteritems():
    ...
Run Code Online (Sandbox Code Playgroud)

如果直接做访问的变量,你会得到一堆东西你不想要的:在建宏(__builtins__,__package__,等); 设置其他变量时导入的任何内容等.

您还需要确保您运行的上下文与您正在迭代的变量的上下文不同,或者您将在locals()(或vars()或globals中创建新变量( ))当你迭代它时,你会得到"RuntimeError: dictionary changed size during iteration".