我正在编写一个小脚本,将一个程序的输出文件转换为另一个程序的输入文件。
要创建这些输入文件,需要一些额外的用户输入。
我希望将此用户输入放在单独的文件中。运行脚本时,用户可以通过sys.argv
将其配置文件指定为字符串。
配置文件只包含变量,而不是函数:
N_a = 2
N_b = 5
N_c = ...
.
.
.
现在,在字符串给出的文件中导入变量的最佳做法是什么?
最重要的是:每次执行脚本时都应重新加载此文件,以防用户在两次运行之间进行更改。是否可以为每个任意文件执行此操作,或者它是否需要是.py
文件?
答案 0 :(得分:2)
要回答您的问题,您可以使用eval
获取任意字符串并将其评估为python代码。或者,您可以使用exec
将任意字符串作为python表达式执行。
一般情况下,执行此操作不推荐,因为它会使您的程序容易受到攻击 - 假设某人知道您的代码正在使用此eval
或exec
函数,恶意用户可以在他们的配置文件中插入一些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...
请注意,存储的值是字符串。您可以根据需要将它们转换为int
或float
s或w / e。
要记住的一点是,这种方法假设任何一行都由variable_name = value
模式组成。如果用户偏离此模式或碰巧提供无效值,则解析器可能会崩溃。有configparser
等模块专门用于指定用户可用于向程序提供数据的配置文件格式。
答案 1 :(得分:1)
最安全的是手动解析文件......
但你当然可以使用
execfile("/path/to/a.py")
虽然..而且它的结局可以是你想要的任何东西.conf,.blah,......