动态导入文件

Dynamically import file

我正在编写一个小脚本,将一个程序的输出文件转换为另一个程序的输入文件。

要创建这些输入文件,需要一些额外的用户输入。 我想将此用户输入放在一个单独的文件中。当 运行 脚本时,用户可以通过 sys.argv 作为字符串指定他的配置文件。

配置文件只包含变量,不包含函数:

N_a = 2
N_b = 5
N_c = ...
 .
 .
 .

现在将变量导入由字符串给定的文件中的最佳做法是什么? 最重要的是:每次执行脚本时都应重新加载此文件,以防用户在两次运行之间更改某些内容。是否可以对每个任意文件执行此操作,还是必须是 .py 文件?

最安全的方法是手动解析文件...

但你当然可以使用

execfile("/path/to/a.py")

虽然..是的,它的结尾可以是任何你想要的.conf, .blah,...

要回答您的问题,您可以使用 eval 获取任意字符串并将其计算为 python 代码。或者,您可以使用 exec 将任意字符串作为 python 表达式执行。

一般来说,不推荐这样做,因为它会使您的程序容易受到攻击 - 假设有人知道您的代码正在使用此 evalexec 函数,恶意用户可以将一些 python 代码插入到他们的配置文件中,并对您的系统造成一些真正的破坏。

相反,我认为您想做的是解析用户的配置文件并适当地设置变量。例如:

# file configParser.py
userfile = 'users_file.txt'
values = {}
with open(userfile, 'r') as infile:
    for line in userfile:
        name, value = line.strip().split('=')
        values[name] = value

您稍后可以使用 values 字典访问这些值:

values['N_a'] # holds '2'
values['N_b'] # holds '5'
# etc...

请注意,存储的值是字符串。您可以根据需要将它们转换为 ints 或 floats 或 w/e。

需要记住的一点是,这种方法假设每一行都由 variable_name = value 模式组成。如果用户偏离此模式或碰巧提供了无效值,解析器可能会崩溃。 configparser 等模块专门用于允许您指定用户可用于向您的程序提供数据的配置文件格式。