python中eval的替代方案,用于从dat文件读取输入



最近,我发现eval在python中的安全性等方面不好。。我已经通过互联网搜索了我案件的最佳替代方案,但找不到有人能为我提供最好的选择吗,我想从input.dat中读取一个数组,并将其作为numpy数组我附上代码和.dat文件

with open('trial.dat', 'r') as f:
data = f.readlines()
data = [(d+' ')[:d.find('#')].rstrip() for d in data]
x_1=eval(data[0])
y=np.concatenate(x_1)

文件中的数据示例如下:

[[1,2,np.repeat(3,1)]]

如果您只想使用numpy操作,那么您可以简单地将其添加为locals字典并排除内置。像这样的东西。如果你只想运行某些函数,比如np.sin或np.array等,你就必须更加具体

import numpy as np
locals = {'np': np}
builtins = {'__builtins__': None}
x = '[[1,2,np.repeat(3,1)]]'
x2 = eval(x, builtins, locals)
x2[0][2]
Out[22]: array([3])

现在,如果有人在其中插入os调用,它将不会执行。

x = 'os.makedirs('C:/test')'
x2 = eval(x, builtins, locals)
NameError: name 'os' is not defined

相关内容

  • 没有找到相关文章

最新更新