【问题标题】:Dynamically import file动态导入文件
【发布时间】:2016-07-21 18:13:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您考虑过使用configparser 模块吗?您可以使用模块中描述的语法创建配置文件并使用它来解析它。

标签: python file import reload


【解决方案1】:

要回答您的问题,您可以使用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...

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

要记住的是,这种方法假设每行都包含variable_name = value 模式。如果用户偏离此模式或碰巧提供了无效值,则解析器可能会崩溃。有一些模块,例如 configparser,是专门构建的,允许您指定用户可以用来向您的程序提供数据的配置文件格式。

【讨论】:

  • 很好的答案 :) ++ 到 configparser 推荐
【解决方案2】:

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

但你当然可以使用

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2020-10-18
    • 1970-01-01
    • 2020-03-02
    • 2020-09-11
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多