本站分享:AI、大数据、数据分析师培训认证考试,包括:Python培训Excel培训Matlab培训SPSS培训SAS培训R语言培训Hadoop培训Amos培训Stata培训Eviews培训

谈谈服务器中python脚本的安全容错处理_python培训

python培训 cdadata 2843℃

谈谈服务器中python脚本的安全容错处理

关键词:python监控服务器脚本,python 服务器脚本,python 服务器

对于一个服务器来说,不管是游戏服务器还是什么服务器,稳定性无疑是最重要,最看重的一个环节了。即使是一个微小的错误,也有可能会引起全局的流程性问题。

服务器中的关键代码一般都是由C或者C++来实现,以获得一个较快的执行速度。而业务逻辑的可变性采用易于维护和编写的python脚本来实现,可以在易于编写和执行速度之间得到一个权衡。
由于脚本的简单和易维护性,目前很多服务器的业务逻辑都有部分放在脚本中。目前比较流行的、与C混合编程的脚本语言有python,lua.

下面我们谈谈python的脚本安全问题。
简单介绍下python:

Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能 上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中。

同时可以借助Python语言提供的API,使用C或者C++来对Python进行功能性扩展,从而即可以利用 Python方便灵活的语法和功能,又可以获得与C或者C++几乎相同的执行性能。执行速度慢是几乎所有脚本语言都具有的共性,也是倍受人们指责的一个重 要因素,Python则通过与C语言的有机结合巧妙地解决了这一问题,从而使脚本语言的应用范围得到了很大扩展。

在由C++或者C扩展python需要关注两个问题。

一、是C++导出给python调用的接口。

C++导出给python调用的接口,是从python脚本将参数传入C++的过程。

导出接口模板PyObject* method(PyObject* self, PyObject* args);

该 函数是Python解释器和C函数进行交互的接口,带有两个参数:self和args。参数self只在C函数被实现为内联方法(built-in method)时才被用到,通常该参数的值为空(NULL)。参数args中包含了Python解释器要传递给C函数的所有参数,通常使用Python的C语言扩展接口提供的函数PyArg_ParseTuple()来获得这些参数值。

所有的导出函数都返回一个PyObject指针,如果对应的C函数没有真正的返 回值(即返回值类型为void),则应返回一个全局的None对象(Py_None),并将其引用计数增1,如下所示:

PyObject* method(PyObject *self, PyObject *args)
{
Py_INCREF(Py_None);
return Py_None;
}

导出接口需要注意3点:

1、注意上面红色部分。如果某导出函数没有返回对象给python,在脚本被调用时,将出现一些稀奇古怪的异常问题。

2、在将python传入的参数进行转换C++识别的数据时,需要对参数进行类型安全判断。

如传入的是字符串,就不能对其调用Pyint_asLong. 否则可能会引起下一次脚本调用出现异常。

3、C++导出的接口如果出现异常,将会引起整次脚本调用无效。所以C++的异常自己捕捉。减小抛出范围

二、是C++调用python脚本时、对象调用和释放的问题

C++调用python脚本时,最需要注意的是python对象释放的问题。

Python往往包含大量的内存分配和释放,需要避免内存泄漏和野指针。python选择的方法就是 引用计数 。其原理比较简单:每个对象都包含一个计数器,计数器的增减与引用的增减直接相关,当引用计数为0时,表示对象已经没有存在的意义了,就可以删除了。

同时python的引用包含两种。一种是拥有一个对象,标示拥有者需要对其负责调用  Py_DECREF() 来减少引用计数。

一种是借用 一个对象,借用的对象不能调用 Py_DECREF() 来减少引用计数。借用者在不需要借用时,不保留其引用就可以了。应该避免拥有者释放对象之后仍然访问对象,也就是野指针。

针对python返回的对象,需要关注2点

1、 对拥有的对象在使用完毕后,一定要释放引用

2、  对借用的对象一定不能调用引用。

在对脚本的返回值特别需要注意返回值的类型和转换工作。

如果脚本函数无返回参数,则函数返回的类型为NoneType。。如果对该NoneType对象进行int转换,将出现异常。对返回值做如下处理比较安全。

if (PyString_Check(value)) {
return PyString_AsString(value);
}
else if (value == Py_None) {
return variant();
}
else if (PyBool_Check(value)) {
return value == Py_True;
}
else if (PyInt_Check(value)) {
return PyInt_AsLong(value);
}
else if (PyFloat_Check(value)) {
return PyFloat_AsDouble(value);
}
三、python脚本本身的异常处理

类似c++中的try/catch..

脚本中采用

try:

except Exception,ex:

print Exception,”:”,ex

来捕获所有异常。在代码中加入异常捕捉,防止由于小范围异常导致整个逻辑出错

转载请注明:数据分析 » 谈谈服务器中python脚本的安全容错处理_python培训

喜欢 (1)or分享 (0)