go python perl混合开发
概念
对于一些上了年纪的项目,重构耗时耗力太大动干戈,不重构又问题重重。举个简单的例子,我司有一些项目是0几年的项目,还是用的perl进行的开发,并且由于其业务特殊(需要在服务器执行脚本),大量脚本素材,重构困难。
出于运维的需要,公司要统一使用的开发语言(后端主要是使用go和java,以及少量的python),并且perl语言开发太难找,接手的大多是半路临时学的,容易给项目埋雷。后来又要同时支持python脚本(相当于perl用python重写),改一个东西需要两个项目一起改,实在是容易出问题。
出于灵光一闪,go可以使用cgo生成c的动态库,而swig刚好可以把c动态库编译为不同语言可以使用的包,于是,考虑到可以使用如下的方式对老旧项目进行优化。
go通过cgo编写动态链接库,再通过swig将动态链接库封装成python、perl可以使用的包,这样就可以实现对旧项目的模块逐步替换。当不熟悉的语言上的代码少了,后续接手的时候运维起来就轻松多了。
下面按照流程讲解整个流程的实现。
cgo部分
cgo部分一般为项目底座,提供所有项目基础的功能,包括配置、nacos、日志等服务。cgo入门可以看这个:https://pkg.go.dev/cmd/cgo
这里就写一个简单的go项目,
package main //注意必须是main包// #include <stdio.h>
import "C"
import "fmt"//export hello
func hello() {fmt.Println("hello biz-binary")
}//export add
func add(a, b int) int {return a + b
}
func main() { //不能省略}
这里导出了两个方法:hello和add,
编译指令(注意导出的so名字必须为libxxx.so,xxx为模块名称):
go build -buildmode=c-shared -o libbiz-binary.so
这个会得到两个文件:libbiz-binary.h
和libbiz-binary.so
,这两个是接下来需要使用的。
swig
swig将刚才导出的库和头文件封装成对应的python和perl的库。
先准备一个.i文件,告诉swig需要导出哪些内容:
%module bizBinary
%{
#include "libbiz-binary.h"
%}
%include "libbiz-binary.h"
bizBinary是包名,另外有很多具体的细节需要自行参考swig的.i文件编写逻辑
编译成python文件
执行指令swig -python bizBinary.i
,可以得到bizBinary.py
和bizBinary_wrap.c
两个文件,前者主要是之后导入的时候的代码提示,后者是一会封装c动态库为python包的文件。
编译
编译之前先进入文件夹/usr/local/include/
看下是否有python的文件夹,如果没有需要通过pip3 install python3-dev
来进行安装。
执行 gcc -c -fpic bizBinary_wrap.c -I/usr/local/include/python3.8
,再执行gcc -shared bizBinary_wrap.o -L. -lbiz-binary -o _bizBinary.so
即可完成编译
测试
完成编译之后,可以通过这个代码进行测试
import bizBinary
print(bizBinary.hello())
print("2 + 3 =",bizBinary.add(2,3))
这个时候可能会报
Traceback (most recent call last):File "pyt.py", line 1, in <module>import bizBinaryFile "/home/yuxf/go/src/unitechs.com/biz-binary/t/bizBinary.py", line 12, in <module>import _bizBinary
ModuleNotFoundError: No module named '_bizBinary'
这是因为在linux系统下,默认只会在环境变量LD_LIBRARY_PATH
配置的文件夹下面找动态链接库,所以需要配置环境变量。
临时解决方案:执行export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/yuxf/go/src/biz-binary/
(注意路径为绝对路径),再执行就可以了。
如果要长期解决方案,这个可以用python的打包工具(比如distutils)将这个包打包成一个pip可安装包,具体教程自行百度(暂时我还不知道…)。一般用不上,除非要发到pip源上去。
编译成perl文件
思路和python的差不多,只是执行的指令变成了这三条:
swig -perl5 bizBinary.igcc -c -fPIC bizBinary_wrap.c -I/usr/lib/x86_64-linux-gnu/perl/5.28/CORE -Dbool=char -Doff64_t=__off64_tgcc -shared bizBinary_wrap.o -L. -lbiz-binary -o bizBinary.so
注意:因为编译的时候可能会出现类似于这种:
/usr/lib/x86_64-linux-gnu/perl/5.28/CORE/perl.h:2494:22: error: unknown type name ‘off64_t’; did you mean ‘off_t’?# define Off_t off64_t
如果出现这种找不到名字的,多半得加宏,即第二条指令后面的:-Dbool=char -Doff64_t=__off64_t
如果出现其他编译问题,去找个c/c++大佬帮忙看看,我也是小白(不是小白我干嘛用cgo库,直接用c动手了)
后记
主要是公司的特殊业务需求和历史包袱导致的这种妥协手段,但是我觉得部分思路是可以通用的,即,使用go编写一个通用底座,让不同的语言使用这个底座,实现统一的输出和功能,减少工作量。
go python perl混合开发相关推荐
- 使用boost.python进行混合开发
使用boost.python进行混合开发 原文请参照官网和各方参考,本文有改动! 参考链接:http://blog.csdn.net/lanbing510/article/details/121979 ...
- Java与Python混合开发
1.Java与Python混合开发 我熟练使用的语言是java,java与python的混合开发怎么实现,javaEE+python来实现在线测试工具.以下是一个简单思路的整理. <depend ...
- go语言和python结合_Go+Python双语言混合开发-第1章 【阶段一:Go语言基础】
1-1 Go+Python双语言混合开发-课程导学 (11:35) 1-2 课程资源获取方式 - 非常重要!!! (06:07) 1-3 课程中需要用到的开发环境介绍 (03:47) 1-4 wind ...
- 如何使用Python+Django+Mysql开发特色美食推荐系统 个性化美食推荐网站 个性化推荐算法开发 基于用户、物品的协同过滤推荐算法 组合、混合推荐算法FoodRecommendSystem
如何使用Python+Django+Mysql开发特色美食推荐系统 个性化美食推荐网站 个性化推荐算法开发 基于用户.物品的协同过滤推荐算法 组合.混合推荐算法FoodRecommendSystem ...
- java与python之间的混合开发
java与python之间的混合开发 1. 项目需求 使用java进行进行数据库的访问,并对查询出的数据进行的数据清理,使用python进行无监督分类 应用场景: . 整个项目是BS架构,基于Spri ...
- FreeCAD C/C++/Python混合开发/调试方案
FreeCAD C/C++/Python混合开发/调试方案 济南友泉软件有限公司 本文主要讲述在Visaul Studio 2019中混合调试FreeCAD C/C++/Python代码的环境配置方法 ...
- 多语言混合开发之易语言调用python算法
点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 扬长避短,发挥各自优势,建立多语言和谐共存的大好局面,介绍多语言的混合开发." 好久没有更新,深感抱歉,还有几天就要过年了,先在这 ...
- 《Python 3程序开发指南(第2版•修订版)》——1.2 Python的关键要素
本节书摘来自异步社区<Python 3程序开发指南(第2版•修订版)>一书中的第1章,第1.2节,作者[英]Mark Summerfield,王弘博,孙传庆 译,更多章节内容可以访问云栖社 ...
- 入门 Kotlin 和 Java 混合开发
一.前沿 如果你学习过其他的编程语言,你就会发现 Java 的语法很是哆嗦,可是我们为什么没有放弃 Java 这门编程语言呢?因为 JVM 是一个非常好的平台,而且 Java 程序员目前在中国所占的比 ...
最新文章
- django rest framework mixins小结
- Swift-跳转到tableView指定位置
- 计算机组成原理重要知识,计算机组成原理重要知识点解析
- python urlretrieve 管道_Python基础之 urllib模块urlopen()与urlretrieve()的使用方法详解。...
- Java开发前景好,3大从业方向供你选择
- 如何理解pytorch 卷积里group 这个参数
- 2d的公式_旋转之二 - 三维空间中的旋转:罗德里格旋转公式
- [渝粤教育] 西南科技大学 货币银行学 在线考试复习资料(1)
- 云原生安全厂商小佑科技获达泰资本千万级投资
- 1×pbs缓冲液配方_【应用】蒸渗仪与氧化还原电位的测量1
- TeeChart的X轴,使用伪装的时间
- JavaEE的核心API与组件
- Windows监控日志文件 Tail for Win32
- css 跳转电脑分辨率
- 一图掌握ICT项目管理流程图【实例】
- 神经元图片结构图,人脑神经元图片
- 什么才是高标准要求自己?
- gRPC-拦截器简单使用
- 新飞重整花落谁家? 多个“接盘侠”浮出水面
- 关于在线评论有用性的论文研读笔记---41-50篇