CN110659022A - 一种基于Java自动调用Python脚本的方法 - Google Patents

一种基于Java自动调用Python脚本的方法 Download PDF

Info

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
Application number
CN201910765411.2A
Other languages
English (en)
Other versions
CN110659022B (zh
Inventor
刘国庆
鲁萍
王新根
周志强
周佳锋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Zhejiang Bangsheng Technology Co.,Ltd.
Original Assignee
Zhejiang Bang Sheng Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Zhejiang Bang Sheng Technology Co Ltd filed Critical Zhejiang Bang Sheng Technology Co Ltd
Priority to CN201910765411.2A priority Critical patent/CN110659022B/zh
Publication of CN110659022A publication Critical patent/CN110659022A/zh
Application granted granted Critical
Publication of CN110659022B publication Critical patent/CN110659022B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming 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脚本的方法
技术领域
本发明涉及软件开发技术领域,尤其涉及一种基于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重新加入到服务列表。
CN201910765411.2A 2019-08-19 2019-08-19 一种基于Java自动调用Python脚本的方法 Active CN110659022B (zh)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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文件的优化方法及优化系统

Patent Citations (5)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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