CN110659022A - 一种基于Java自动调用Python脚本的方法 - Google Patents
一种基于Java自动调用Python脚本的方法 Download PDFInfo
- Publication number
- CN110659022A CN110659022A CN201910765411.2A CN201910765411A CN110659022A CN 110659022 A CN110659022 A CN 110659022A CN 201910765411 A CN201910765411 A CN 201910765411A CN 110659022 A CN110659022 A CN 110659022A
- Authority
- CN
- China
- Prior art keywords
- python
- script
- java
- service
- called
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于Java自动调用Python脚本的方法,使用java自动启动、关闭python service端。java通过http访问来调用python文件,python文件可集成所有需要调用的python脚本。同时java自动封装好参数调用对应的python脚本并自动注入函数参数。本发明可自管理所有的python进程,负载均衡。本发明方法能够兼容各个python版本,能够通过配置调用所有的python脚本及里面的函数,不需要修改代码,上手简单,部署方便,不需要额外的web容器。
Description
技术领域
本发明涉及软件开发技术领域,尤其涉及一种基于Java自动调用Python脚本的方法。
背景技术
python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库。它已经成为继Java、C++之后的第三大语言,Python除了极少的事情不能做之外,基本上可以说全能,系统运维、图形处理、数学处理、文本处理、数据库编程、网络编程、web编程、多媒体应用、pymo引擎、黑客编程、爬虫编写、机器学习、人工智能等。
在互联网快速发展的时代,对应出现了不同的操作系统(不同的平台),那么java就可以一份代码在各个平台运行。这种跨平台性是其他语言所不能相比的,这个特性才是java最独特的地方。Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以构建防病毒,防篡改的系统。
在Java中调用Python代码,现有的技术方案大概可分为:
1.在java类中直接执行python语句,此方法需要引用org.python包,需要下载Jpython,但是如何调用需要根据需求人工写代码。
2.使用Runtime.getRuntime()执行脚本文件,但是如何调用需要根据需求人工写代码。
现有技术的缺点概括如下:
1.使用Jpython调用的python库不多,如果用Jpython调用,而python的程序中使用到第三方库,这时就会报错java ImportError:No module named xxx。无法调用所有的python脚本,无法自动上线。
2.Runtime.getRuntime()执行脚本文件入门比较难,调试难度高,出现错误不容易解决。
3.使用java直接调用python效率上会有很大影响。
4.一旦python的版本发生变化,会对程序产生未可知的影响。
5.一旦需要调用新的python文件还需要修改代码,重新上线。
6.python web service的部署一般都要使用到web容器还有nginx转发等部署繁复麻烦。
发明内容
本发明的目的在于针对现有技术的不足,提供一种基于Java自动调用Python脚本的方法。
本发明的目的是通过以下技术方案来实现的:一种基于Java自动调用Python脚本的方法,该方法包括以下步骤:
(1)采用spring-boot框架搭建java service,在配置文件中定义需要调用的python脚本名称、脚本中需要调用的函数名称、以及函数参数与业务数据源的字段映射。
(2)启动java service,同时读取配置文件的信息并存放到ConcurrentHashMap,以调用的python脚本名称及脚本中需要调用的函数名称作为KEY,数据源的字段映射作为VALUE。
(3)在启动java service时,找到python启动脚本即flask启动脚本,复制多份同样的python启动脚本,之后使用ProcessBuilder调用启动命令启动多个python service;在python启动脚本中定义有待调用python脚本的路径,启动python service的同时,初始化该路径下面所有的python脚本,同时通过importlib的方式把所有待调用的脚本信息存在一个全局字典中,以python脚本名称作为KEY,python脚本实例化后的对象为VALUE,启动多个python service后向javaservice返回所有启动的端口,由此组成一份可供java调用的python service服务列表,java可通过选择调用其中一个python service执行配置文件中已定义好的python脚本。
(4)在java service中组装需要调用的python脚本名称和脚本中需要调用的函数名称,同时根据配置文件中函数参数与数据源的字段映射,组装python脚本中调用函数的参数具体值。
(5)在java service中通过http方式轮询调用步骤3构建的python service服务列表,如果当前获取到的python service有异常则继续从服务列表中取pythonservice执行。根据步骤4组装后的参数,去python service的全局字典中自动寻找python脚本,获取到脚本对象后,根据参数调用getattr函数获得待调用python脚本中待调用的函数,实现在Java中自动调用Python脚本。
进一步地,所述步骤(1)中,所述配置文件可以用第三方平台、数据库、缓存等替代。
进一步地,所述步骤(5)中,调用时使用*语法解包参数集合,执行待调用的函数。
进一步地,所述步骤(5)中,执行完调用函数后,根据python脚本名称、函数与执行结果组成映射关系,返回给java service,再由java service进行处理。
进一步地,在关闭java service时关闭所有python进程。
进一步地,在java service中定义一个定时任务,用于验证已启动的pythonservice服务列表的健康。如果发现其中的一个或多个python service异常,则停止异常进程,并从服务列表中移除异常python service,之后重新复制python启动脚本,并启动相应数量的python service重新加入到服务列表。
本发明的有益效果如下:
1.java调用python脚本执行效率高。
2.兼容各个python版本。
3.能够通过配置调用所有的python脚本及里面的函数,不需要修改代码。
4.上手简单只要懂python、java就行,不用研究他的交互。
5.由java实现supervisor功能、nginx转发负载均衡功能,从而不需要再部署这些内容。
6.Java通过http访问python,TPS能够达到20000,效率高。
7.部署方便,不需要额外的web容器。
附图说明
图1为本发明基于Java自动调用Python脚本的方法总体流程图;
图2为启动流程图;
图3为调用流程图;
图4为健康检查流程图。
具体实施方式
下面结合附图和具体实施例对本发明作进一步详细说明。
如图1所示,本发明提供的一种基于Java自动调用Python脚本的方法,包括以下步骤:
1.采用spring-boot框架搭建java service,在配置文件中或者其他来源(如第三方平台、数据库、缓存等)定义需要调用的python脚本名称、脚本中需要调用的函数名称、以及函数参数与业务数据源的字段映射。以下给出一个示例:
model.audit:
structured_information.get_share_info:s=ALTAF,d=frms_addr
a.b:a=frms_a,b=frms_b
structured_information.b:a=frms_a,b=frms_b
其中structured_information是需要调用的python脚本名称,get_share_info和b分别是structured_information里面的函数。s和d是函数get_share_info的参数名称即get_share_info函数格式为get_share_info(s,d)。ALTER和frms_addr是数据源中的字段属性。
2.启动java service,同时读取配置文件的信息并存放到ConcurrentHashMap,以调用的python脚本名称及脚本中需要调用的函数名称(即调用方法)作为KEY,数据源的字段映射作为VALUE。
3.如图2所示,在启动java service时,在web-service文件夹中找到python启动脚本即flask启动脚本,根据配置文件的配置复制多份同样的python启动脚本,之后使用ProcessBuilder调用启动命令启动多个python service,python service是使用flask框架对外提供web服务;在python启动脚本中定义有待调用python脚本的路径,启动pythonservice的同时,初始化该路径下面所有的python脚本,同时通过importlib的方式把所有待调用的脚本信息存在一个全局字典中,以python脚本名称作为KEY,python脚本实例化后的对象为VALUE,启动多个python service后向java service返回所有启动的端口,由此组成一份可供java调用的python service服务列表,java可通过选择调用其中一个pythonservice执行配置文件中已定义好的python脚本。
4.在java service中组装需要调用的python脚本名称和脚本中需要调用的函数名称,同时根据配置文件中函数参数与数据源的字段映射,组装python脚本中调用函数的参数具体值。以上述脚本为例组装后的参数如下:
{a.b={"a":"1","b":"信贷"},structured_information.b={"a":"1","b":"信贷"},structured_information.get_share_info={"s":"1","d":"1"}}
5.如图3所示,在java service中通过http方式轮询调用步骤3构建的pythonservice服务列表,如果当前获取到的python service有异常则继续从服务列表中取python service执行。根据步骤4组装后的参数,去python service的全局字典中自动寻找python脚本,获取到脚本对象后,根据参数调用getattr函数获得待调用python脚本中待调用的函数。
由于在java中已经将步骤4组装后的参数处理成键值对的形式,所以调用时使用*语法(*语法定义:在函数头部,它意味着收集任意数量的参数,而在调用时,它解包任意数量的参数。)解包参数集合,执行待调用的函数,在此过程中不需要关心python的版本,也不需要关心python脚本函数的参数有多少,参数的类型是什么,只要配置文件进行了步骤1中的配置,都能正确执行对应的python脚本和函数。执行完成后根据python脚本名称、函数与执行结果组成映射关系,返回给java service,再由java service进行处理。
6.在关闭java service时,关闭所有python进程,实现全自动上线执行python脚本。
此外,如图4所示,可以在java service中定义一个定时任务,用于验证已启动的python service服务列表的健康。如果发现其中的一个或多个pythonservice异常,则停止异常进程,并从服务列表中移除异常python service,之后重新复制python启动脚本,并启动相应数量的python service重新加入到服务列表。
本发明使用java自动启动、关闭python service端。java通过http访问来调用python文件,python文件可集成所有需要调用的python脚本。同时java自动封装好参数调用对应的python脚本并自动注入函数参数。可自管理所有的python进程,负载均衡。
最后说明,以上为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本领域的技术人员在本发明揭露的技术范围内,可以轻易的对本发明的技术方案进行修改或者等同替换,都应涵盖在本发明的权利要求范围当中。
Claims (6)
1.一种基于Java自动调用Python脚本的方法,其特征在于,该方法包括以下步骤:
(1)采用spring-boot框架搭建java service,在配置文件中定义需要调用的python脚本名称、脚本中需要调用的函数名称、以及函数参数与业务数据源的字段映射。
(2)启动java service,同时读取配置文件的信息并存放到ConcurrentHashMap,以调用的python脚本名称及脚本中需要调用的函数名称作为KEY,数据源的字段映射作为VALUE。
(3)在启动java service时,找到python启动脚本即flask启动脚本,复制多份同样的python启动脚本,之后使用ProcessBuilder调用启动命令启动多个python service;在python启动脚本中定义有待调用python脚本的路径,启动python service的同时,初始化该路径下面所有的python脚本,同时通过importlib的方式把所有待调用的脚本信息存在一个全局字典中,以python脚本名称作为KEY,python脚本实例化后的对象为VALUE,启动多个python service后向java service返回所有启动的端口,由此组成一份可供java调用的python service服务列表,java可通过选择调用其中一个python service执行配置文件中已定义好的python脚本。
(4)在java service中组装需要调用的python脚本名称和脚本中需要调用的函数名称,同时根据配置文件中函数参数与数据源的字段映射,组装python脚本中调用函数的参数具体值。
(5)在java service中通过http方式轮询调用步骤3构建的python service服务列表,如果当前获取到的python service有异常则继续从服务列表中取python service执行。根据步骤4组装后的参数,去python service的全局字典中自动寻找python脚本,获取到脚本对象后,根据参数调用getattr函数获得待调用python脚本中待调用的函数,实现在Java中自动调用Python脚本。
2.根据权利要求1所述的一种基于Java自动调用Python脚本的方法,其特征在于,所述步骤(1)中,所述配置文件可以用第三方平台、数据库、缓存等替代。
3.根据权利要求1所述的一种基于Java自动调用Python脚本的方法,其特征在于,所述步骤(5)中,调用时使用*语法解包参数集合,执行待调用的函数。
4.根据权利要求1所述的一种基于Java自动调用Python脚本的方法,其特征在于,所述步骤(5)中,执行完调用函数后,根据python脚本名称、函数与执行结果组成映射关系,返回给java service,再由java service进行处理。
5.根据权利要求1所述的一种基于Java自动调用Python脚本的方法,其特征在于,在关闭java service时关闭所有python进程。
6.根据权利要求1所述的一种基于Java自动调用Python脚本的方法,其特征在于,在java service中定义一个定时任务,用于验证已启动的python service服务列表的健康。如果发现其中的一个或多个python service异常,则停止异常进程,并从服务列表中移除异常python service,之后重新复制python启动脚本,并启动相应数量的python service重新加入到服务列表。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910765411.2A CN110659022B (zh) | 2019-08-19 | 2019-08-19 | 一种基于Java自动调用Python脚本的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910765411.2A CN110659022B (zh) | 2019-08-19 | 2019-08-19 | 一种基于Java自动调用Python脚本的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110659022A true CN110659022A (zh) | 2020-01-07 |
CN110659022B CN110659022B (zh) | 2020-09-04 |
Family
ID=69037579
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910765411.2A Active CN110659022B (zh) | 2019-08-19 | 2019-08-19 | 一种基于Java自动调用Python脚本的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110659022B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111258595A (zh) * | 2020-03-13 | 2020-06-09 | 山东超越数控电子股份有限公司 | 一种基于PyInstaller的python源代码封装方法 |
CN112699044A (zh) * | 2021-01-05 | 2021-04-23 | 长沙市到家悠享家政服务有限公司 | 压力测试方法、设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101056429A (zh) * | 2007-05-29 | 2007-10-17 | 华为技术有限公司 | 通用业务系统及其实现方法 |
US8127038B2 (en) * | 2008-03-11 | 2012-02-28 | International Business Machines Corporation | Embedded distributed computing solutions |
CN105574368A (zh) * | 2015-12-10 | 2016-05-11 | 华青融天(北京)技术股份有限公司 | 一种Python程序模块的安全调用方法和装置 |
CN106254121A (zh) * | 2016-08-11 | 2016-12-21 | 浪潮软件股份有限公司 | 一种自动化部署与管理大数据集群的方法 |
CN106648638A (zh) * | 2016-12-09 | 2017-05-10 | 武汉斗鱼网络科技有限公司 | 一种基于python的R.java文件的优化方法及优化系统 |
-
2019
- 2019-08-19 CN CN201910765411.2A patent/CN110659022B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101056429A (zh) * | 2007-05-29 | 2007-10-17 | 华为技术有限公司 | 通用业务系统及其实现方法 |
US8127038B2 (en) * | 2008-03-11 | 2012-02-28 | International Business Machines Corporation | Embedded distributed computing solutions |
CN105574368A (zh) * | 2015-12-10 | 2016-05-11 | 华青融天(北京)技术股份有限公司 | 一种Python程序模块的安全调用方法和装置 |
CN106254121A (zh) * | 2016-08-11 | 2016-12-21 | 浪潮软件股份有限公司 | 一种自动化部署与管理大数据集群的方法 |
CN106648638A (zh) * | 2016-12-09 | 2017-05-10 | 武汉斗鱼网络科技有限公司 | 一种基于python的R.java文件的优化方法及优化系统 |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111258595A (zh) * | 2020-03-13 | 2020-06-09 | 山东超越数控电子股份有限公司 | 一种基于PyInstaller的python源代码封装方法 |
CN111258595B (zh) * | 2020-03-13 | 2023-08-01 | 超越科技股份有限公司 | 一种基于PyInstaller的python源代码封装方法 |
CN112699044A (zh) * | 2021-01-05 | 2021-04-23 | 长沙市到家悠享家政服务有限公司 | 压力测试方法、设备及存储介质 |
CN112699044B (zh) * | 2021-01-05 | 2023-02-24 | 长沙市到家悠享家政服务有限公司 | 压力测试方法、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110659022B (zh) | 2020-09-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20200192646A1 (en) | Compiler and method for compiling business rules for a serverless runtime environment | |
CN111708539A (zh) | 一种应用程序代码转换方法、装置、电子设备和存储介质 | |
US11113050B2 (en) | Application architecture generation | |
KR20160060023A (ko) | 코드 가상화 및 원격 프로세스 호출 생성을 위한 방법 및 장치 | |
US10083029B2 (en) | Detect application defects by correlating contracts in application dependencies | |
CA2621810A1 (en) | Extensible mechanism for object composition | |
CN113885849B (zh) | 基于工业互联网平台的应用开发方法、装置及终端设备 | |
CN105204917B (zh) | 在应用程序启动时加载配置文件的方法及装置 | |
CN110007926B (zh) | 语言转换方法及装置 | |
EP3447635A1 (en) | Application architecture generation | |
CN110659022B (zh) | 一种基于Java自动调用Python脚本的方法 | |
CN110069259A (zh) | 基于idl文件的解析方法、装置、电子设备和存储介质 | |
CN113407362A (zh) | 基于车载Android系统SOA架构SOMEIP通信中间层实现方法及系统 | |
Jaworski et al. | Expert Python Programming: Become a master in Python by learning coding best practices and advanced programming concepts in Python 3.7 | |
Choi | Full-Stack React, TypeScript, and Node: Build cloud-ready web applications using React 17 with Hooks and GraphQL | |
CN111240772A (zh) | 一种基于区块链的数据处理方法、装置及存储介质 | |
CN114895935A (zh) | 刷写车辆ecu的方法、装置、电子设备及存储介质 | |
US11275567B1 (en) | Making communication interfaces pluggable by using mechanisms comprising of exchange/broker for communication interfaces | |
Bampakos et al. | Learning Angular: A no-nonsense guide to building web applications with Angular 15 | |
Shute | Advanced JavaScript: Speed up web development with the powerful features and benefits of JavaScript | |
US10606569B2 (en) | Declarative configuration elements | |
CN111880801A (zh) | 应用程序动态化方法、装置、电子设备 | |
Yamagata et al. | Runtime monitoring for concurrent systems | |
Rahman et al. | A DSL for importing models in a requirements management system | |
CN110826074A (zh) | 一种应用漏洞检测方法、装置和计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CP01 | Change in the name or title of a patent holder |
Address after: Room ABCD, 17th floor, building D, Paradise Software Park, No.3 xidoumen Road, Xihu District, Hangzhou City, Zhejiang Province, 310012 Patentee after: Zhejiang Bangsheng Technology Co.,Ltd. Address before: Room ABCD, 17th floor, building D, Paradise Software Park, No.3 xidoumen Road, Xihu District, Hangzhou City, Zhejiang Province, 310012 Patentee before: ZHEJIANG BANGSUN TECHNOLOGY Co.,Ltd. |
|
CP01 | Change in the name or title of a patent holder |