一种从数据库加载Python脚本并使用的方法及系统与流程

文档序号:30081793发布日期:2022-05-18 04:32阅读:174来源:国知局
一种从数据库加载Python脚本并使用的方法及系统与流程
一种从数据库加载python脚本并使用的方法及系统
技术领域
1.本发明属于计算机技术领域,具体而言属于一种从数据库加载python脚本并使用的方法及系统。


背景技术:

2.对于支持执行用户自定义python脚本的系统中,是否能方便有效地管理用户提交的自定义python脚本是一个必须要面对的问题。
3.一般来说,支持执行用户自定义脚本的系统,往往会把用户自定义脚本保存为本地文件来直接执行(如:用php编写的wordpress),也有将用户自定义脚本放入容器中运行的方式(各家云厂商的serverless平台),然而上述方法均存在其各自的弊端。
4.对于保存为本地文件直接运行的方式,当服务器存在多台时,必然要做额外的工作保证各个服务器上的用户自定义脚本文件一致,同时本地文件也会在运行时被缓存,脚本更新后必须清除缓存才能执行新版本的脚本。
5.对于放入容器中运行的方式,首先由于容器中需要启动一个完整的,和主程序隔离的环境,耗费资源比较多,并且在脚本更新后,需要更新容器才能执行新版本的脚本,加剧了资源的耗费。
6.此外,python语言多个脚本文件之间的相互引用是基于磁盘文件系统进行的。而对于将脚本文件内容保存在数据库中,在需要执行时取出执行的系统,由于脚本并不保存在磁盘上,因此import语句只能正常导入python内置库以及已经在系统中安装的第三方库,无法导入另一个保存在数据库中的python脚本,也增加了不便之处。
7.有鉴于此,特提出本发明。


技术实现要素:

8.本发明的第一目的在于提供一种从数据库加载python脚本并使用的方法,该方法是通过将编写完成的脚本以脚本id和脚本内容的形式保存入数据库中,如此便轻松解决了保存在本地可能会出现的数据不一致的问题,并且保存到数据库中的python脚本不仅可以取出供使用者直接运行,也可以通过封装为包的形式供其他使用者进行导入,大大提高了用户自定义脚本编写的灵活性和可扩展性。
9.本发明的第二目的在于提供了一种从数据库加载python脚本并使用的系统,本系统是基于上述方法所设计,也即是说本系统的设计为上述方法的实现提供了坚实的底层保障。
10.为了实现本发明的上述目的,特采用以下技术方案:
11.本方法的方法包括如下步骤:
12.编写脚本,并将编写完成的脚本以脚本id为key值,脚本内容为value值保存入数据库中;
13.根据脚本id,从数据库中取出脚本内容,并通过直接获取脚本的函数对象的方式
直接运行和/或通过创建并返回模块对象的方式封装为包。
14.这里的直接运行和封装为包是和/或关系,也即是说这里的直接运行和封装为包可以共同存在也可以分别存在。
15.优选地,直接运行脚本的方法包括如下步骤:
16.根据脚本id,创建脚本运行上下文;
17.加载脚本,并返回加载脚本后的上下文;
18.从所述加载脚本后的上下文中获取脚本中待调用的函数,并直接运行所述函数。
19.具体而言即是,在使用者需要使用到某个脚本和/或某个脚本中的某个函数时。其会向平台发送一个执行脚本或执行函数的http请求,所述请求中包含了脚本名和函数名;
20.平台会根据接收到的http请求中包含的脚本名字,从数据库中获取脚本名字对应的脚本内容;
21.获取到脚本内容后会根据内容创建脚本运行的上下文,也即是脚本运行的环境,与此同时使用python语言内置的函数加载上述取出的脚本内容;
22.此时从加载完成脚本后的上下文中获取到使用者需要使用的脚本和/或脚本中的特定函数,获取到之后便直接运行。
23.优选地,在脚本和/或函数运行结束之后会生成返回值,平台会将所述返回值以http响应的形式返回给http请求的发起者,也即是脚本和/或函数的使用者,并且在平台的界面上展示所述脚本和/或函数调用后的返回值。
24.优选地,所述封装为包的方法包括如下步骤:
25.在平台执行某个自定义脚本之前,会对该脚本的上下文进行一些改动,具体而言即是将上下文中的原生的import函数替换为平台提供的custom_import函数;
26.并且值得一提的是,原生的import函数是从磁盘加载脚本并返回模块,而本发明提供的替换后的函数是从数据库加载脚本并返回模块,这两个方法都是要返回模块的,否则导入处理不成立。
27.当所述自定义脚本执行时,执行到import语句时,由于原生import函数已经被替换,因此实际执行的是替换成的custom_import函数,在此函数中,会根据函数的参数即脚本id,从数据库中查询此脚本是否存在;
28.若所述脚本存在,则根据所述脚本id进行创建模块对象;
29.创建上下文加载所述待导入脚本,将加载脚本后的上下文作为模块的上下文填入所述模块对象;
30.返回所述模块对象,以供所述自定义脚本作为包进行导入。
31.事实上,根据所属脚本id生成的模块对象可以视作是空白模块,后面步骤中创建的上下文在加载脚本后是需要填入模块以作为模块的上下文的,也即是说模块创建过程中只存在一个上下文。
32.优选地,在自定义脚本中,指定的也可以不是脚本id,而是脚本中的特定函数的id,此时会从所述模块对象的上下文中获取所述特定的函数,并加入到所述自定义脚本的上下文中。
33.优选地,若是所述脚本id不存在于数据库中,则会调用python原生的import函数,按照原本的处理方式来进行创建模块对象以及导入第三方包。
34.本发明提供的从数据库加载python脚本并使用的系统包括:
35.保存模块:编写脚本,并将编写完成的脚本以脚本id为key值,脚本内容为value值保存入数据库中;
36.使用模块:根据脚本id,从数据库中取出脚本内容,并通过直接获取脚本的函数对象的方式直接运行和/或通过创建并返回模块对象的方式封装为包。
37.并且本发明还公开了一种计算机可读存储介质,其上存储有计算机程序,所述程序执行时实现上述方法的步骤。
38.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法的步骤。
39.与现有技术相比,本发明的有益效果在于:
40.(1)python脚本以文本形式保存在数据库,使得多个服务器之间不需要进行同步python脚本的工作。
41.(2)脚本直接在主程序中运行,节约了另外启动运行环境的时间,提高了脚本的启动速度。
附图说明
42.通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
43.图1为本发明实施例提供的从数据库加载python脚本并使用的方法流程示意图;
44.图2为本发明实施例提供的直接运行脚本的方法流程示意图;
45.图3为本发明实施例提供的封装为包的方法流程示意图;
46.图4为本发明实施例提供的从数据库加载python脚本并使用的系统示意图;
47.图5为本发明实施例提供的一种计算机设备的结构示意图。
具体实施方式
48.下面将结合附图和具体实施方式对本发明的技术方案进行清楚、完整地描述,但是本领域技术人员将会理解,下列所描述的实施例是本发明一部分实施例,而不是全部的实施例,仅用于说明本发明,而不应视为限制本发明的范围。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
49.为了更加清晰的对本发明中的技术方案进行阐述,下面以具体实施例的形式进行说明。
50.实施例
51.参阅图1-3所示,本实施例提供了一种从数据库加载python脚本并使用的方法,本方法包括如下步骤:
52.s1-1:编写脚本,并将编写完成的脚本以脚本id为key值,脚本内容为value值保存入数据库中;
53.s1-2:根据脚本id,从数据库中取出脚本内容,并通过直接获取脚本的函数对象的
方式直接运行和/或通过创建并返回模块对象的方式封装为包。
54.在本实施例中,脚本编写完成后会调用save_script(id,code)函数将脚本保存在数据库中,其中参数id即是脚本id,参数code即是脚本的具体内容。
55.在步骤s1-2中,当平台接收到执行脚本的http请求后,会调用get_script(id)函数,其中的参数id即是脚本id,通过此函数将脚本内容从数据库中取出。
56.其中步骤s1-2中取出脚本内容后有两种处理方式的,分别是直接运行和封装为包,其中直接运行包括如下步骤:
57.s2-1:根据脚本id,创建脚本运行上下文;
58.s2-2:加载脚本,并返回加载脚本后的上下文;
59.s2-3:从所述加载脚本后的上下文中获取脚本中待调用的函数,并直接运行所述函数。
60.其中在步骤s2-1中,获取到脚本id后,调用create_context(id)函数,其中的参数id为所述脚本id,通过此函数创建脚本运行上下文。
61.在步骤s2-2中,调用load_script(code,context)函数,其中参数code为脚本内容,context为上述create_context(id)函数创建的脚本运行上下文,在此函数中会调用到python内置的exec函数来加载脚本,并在加载完成后将加载脚本后的上下文进行返回。
62.在步骤s2-3中,调用call_func(name,context)函数,参数name为用户指定的函数名,context为步骤s2-2返回的加载脚本后的上下文,在此函数中会获取到待调用的函数,并运行此函数。
63.在上述步骤s2-3中获取待调用的函数时,若发现函数不存在,则返回http响应,提示用户函数不存在;若函数存在,则返回http响应,并且在界面上展示函数调用后的返回值。
64.取出脚本后的另一种处理方式为将其封装为包,封装为包的方法包括如下步骤:
65.s3-1:用户自定义脚本运行过程中,遇到导入语句时,根据所述导入语句中的指定id从数据库中查询脚本id;
66.s3-2:若所述脚本id存在,则根据所述脚本id生成模块对象;
67.s3-3:创建上下文加载所述待导入脚本,将加载脚本后的上下文作为模块的上下文填入所述模块对象;
68.s3-4:返回所述模块对象,以供所述用户自定义脚本作为包进行导入。
69.其中步骤s3-1中,在用户的自定义脚本运行过程中遇到导入语句也即是import语句时,平台会调用get_script(id)函数,此函数会以脚本id为参数值从数据库中进行查询并判断该脚本id是否存在于数据库中。
70.若是所述脚本id存在于数据库中,则调用create_user_module(name,code),将用户自定义脚本创建为模块对象,其中的参数name为步骤s3-1中import语句要导入的包的名字,参数code为从数据库中取出的脚本内容。
71.在步骤s3-3中,为待导入脚本创建上下文并加载所述待导入脚本,将加载脚本后的上下文作为模块的上下文填入所述模块对象。
72.在步骤s3-4中,会将上述步骤中创建的模块对象返回,如此一来便完成了将数据库中加载出来的python脚本封装为包的过程。
73.在步骤s3-1之前,还包括一个替换import函数的过程,具体为将其中的__builtins__.__import__替换为平台提供的自定义导入处理函数custom_import(name),其中参数name为导入时的包名(即import my_pkg语句中的my_pkg),如此做的目的在于,当用户的自定义脚本运行过程中,遇到import语句时会直接运行所述平台提供的自定义导入处理函数,在此函数中进行查询脚本id以及判断等一系列操作。
74.本实施例还提供一种情况即是步骤s3-1中的脚本id其实为脚本中的某特定函数的函数id,例如from my_pkg import a,此导入语句中的my_pkg和a一起作为所述函数id,此情况会从所述模块对象的上下文中获取到与所述函数id对应名称的对象,并加入到当前运行的用户自定义脚本的上下文中。
75.此外,在步骤s3-1中,若是判断发现所述脚本id不存在于数据库中,则会直接调用python内置原生的导入函数importlib.__import__(name),其中参数name为需要导入的包的名字,返回创建的模块对象,此情况下便是会按照原本的处理方式,导入python系统模块或者安装的第三方包。此处调用的原生的导入函数也即是上述被替换掉的导入函数。
76.如图4所示,本实施例还提供了一种从数据库加载python脚本并使用的系统,所述系统包括:
77.保存模块4-1:编写脚本,并将编写完成的脚本以脚本id为key值,脚本内容为value值保存入数据库中;
78.使用模块4-2:根据脚本id,从数据库中取出脚本内容,并通过直接获取脚本的函数对象的方式直接运行和/或通过创建并返回模块对象的方式封装为包。
79.本实施例还提供了一种计算机可读存储介质和一种计算机设备。
80.图5是本发明公开的一种计算机设备的结构示意图。参考图5所示,该计算机设备包括:输入装置63、输出装置64、存储器62和处理器61;所述存储器62,用于存储一个或多个程序;当所述一个或多个程序被所述一个或多个处理器61执行,使得所述一个或多个处理器61实现如上述实施例提供的加载python脚本并使用的方法;其中输入装置63、输出装置64、存储器62和处理器61可以通过总线或者其他方式连接,图5中以通过总线连接为例。
81.存储器62作为一种计算设备可读写存储介质,可用于存储软件程序、计算机可执行程序,如本技术实施例所述的方法对应的程序指令;存储器62可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据设备的使用所创建的数据等;此外,存储器62可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件或其他非易失性固态存储器件;在一些实例中,存储器62可进一步包括相对于处理器61远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
82.输入装置63可用于接收输入的数字或字符信息,以及产生与设备的用户设置以及功能控制有关的键信号输入;输出装置64可包括显示屏等显示设备。
83.处理器61通过运行存储在存储器62中的软件程序、指令以及模块,从而执行设备的各种功能应用以及数据处理。
84.上述提供的计算机设备可用于执行上述实施例提供的加载python脚本并使用的方法,具备相应的功能和有益效果。
85.本技术实施例还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行如上述实施例提供的加载python脚本并使用的方法,存储介质是任何的各种类型的存储器设备或存储设备,存储介质包括:安装介质,例如cd-rom、软盘或磁带装置;计算机系统存储器或随机存取存储器,诸如dram、ddr ram、sram、edo ram,兰巴斯(rambus)ram等;非易失性存储器,诸如闪存、磁介质(例如硬盘或光存储);寄存器或其它相似类型的存储器元件等;存储介质可以还包括其它类型的存储器或其组合;存储介质包括可以驻留在不同位置中(例如在通过网络连接的不同计算机系统中)的两个或更多存储介质。存储介质可以存储可由一个或多个处理器执行的程序指令(例如具体实现为计算机程序)。
86.最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1