动态导入文件

时间:2016-04-01 19:54:37

标签: python file import reload

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

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

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

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

现在,在字符串给出的文件中导入变量的最佳做法是什么? 最重要的是:每次执行脚本时都应重新加载此文件,以防用户在两次运行之间进行更改。是否可以为每个任意文件执行此操作,或者它是否需要是.py文件?

2 个答案:

答案 0 :(得分:2)

要回答您的问题,您可以使用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 dict来访问这些值:

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

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

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

答案 1 :(得分:1)

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

但你当然可以使用

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

虽然..而且它的结局可以是你想要的任何东西.conf,.blah,......