最近,我发现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