概念

对于一些上了年纪的项目,重构耗时耗力太大动干戈,不重构又问题重重。举个简单的例子,我司有一些项目是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.hlibbiz-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.pybizBinary_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混合开发相关推荐

  1. 使用boost.python进行混合开发

    使用boost.python进行混合开发 原文请参照官网和各方参考,本文有改动! 参考链接:http://blog.csdn.net/lanbing510/article/details/121979 ...

  2. Java与Python混合开发

    1.Java与Python混合开发 我熟练使用的语言是java,java与python的混合开发怎么实现,javaEE+python来实现在线测试工具.以下是一个简单思路的整理. <depend ...

  3. go语言和python结合_Go+Python双语言混合开发-第1章 【阶段一:Go语言基础】

    1-1 Go+Python双语言混合开发-课程导学 (11:35) 1-2 课程资源获取方式 - 非常重要!!! (06:07) 1-3 课程中需要用到的开发环境介绍 (03:47) 1-4 wind ...

  4. 如何使用Python+Django+Mysql开发特色美食推荐系统 个性化美食推荐网站 个性化推荐算法开发 基于用户、物品的协同过滤推荐算法 组合、混合推荐算法FoodRecommendSystem

    如何使用Python+Django+Mysql开发特色美食推荐系统 个性化美食推荐网站 个性化推荐算法开发 基于用户.物品的协同过滤推荐算法 组合.混合推荐算法FoodRecommendSystem ...

  5. java与python之间的混合开发

    java与python之间的混合开发 1. 项目需求 使用java进行进行数据库的访问,并对查询出的数据进行的数据清理,使用python进行无监督分类 应用场景: . 整个项目是BS架构,基于Spri ...

  6. FreeCAD C/C++/Python混合开发/调试方案

    FreeCAD C/C++/Python混合开发/调试方案 济南友泉软件有限公司 本文主要讲述在Visaul Studio 2019中混合调试FreeCAD C/C++/Python代码的环境配置方法 ...

  7. 多语言混合开发之易语言调用python算法

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 扬长避短,发挥各自优势,建立多语言和谐共存的大好局面,介绍多语言的混合开发." 好久没有更新,深感抱歉,还有几天就要过年了,先在这 ...

  8. 《Python 3程序开发指南(第2版•修订版)》——1.2 Python的关键要素

    本节书摘来自异步社区<Python 3程序开发指南(第2版•修订版)>一书中的第1章,第1.2节,作者[英]Mark Summerfield,王弘博,孙传庆 译,更多章节内容可以访问云栖社 ...

  9. 入门 Kotlin 和 Java 混合开发

    一.前沿 如果你学习过其他的编程语言,你就会发现 Java 的语法很是哆嗦,可是我们为什么没有放弃 Java 这门编程语言呢?因为 JVM 是一个非常好的平台,而且 Java 程序员目前在中国所占的比 ...

最新文章

  1. django rest framework mixins小结
  2. Swift-跳转到tableView指定位置
  3. 计算机组成原理重要知识,计算机组成原理重要知识点解析
  4. python urlretrieve 管道_Python基础之 urllib模块urlopen()与urlretrieve()的使用方法详解。...
  5. Java开发前景好,3大从业方向供你选择
  6. 如何理解pytorch 卷积里group 这个参数
  7. 2d的公式_旋转之二 - 三维空间中的旋转:罗德里格旋转公式
  8. [渝粤教育] 西南科技大学 货币银行学 在线考试复习资料(1)
  9. 云原生安全厂商小佑科技获达泰资本千万级投资
  10. 1×pbs缓冲液配方_【应用】蒸渗仪与氧化还原电位的测量1
  11. TeeChart的X轴,使用伪装的时间
  12. JavaEE的核心API与组件
  13. Windows监控日志文件 Tail for Win32
  14. css 跳转电脑分辨率
  15. 一图掌握ICT项目管理流程图【实例】
  16. 神经元图片结构图,人脑神经元图片
  17. 什么才是高标准要求自己?
  18. gRPC-拦截器简单使用
  19. 新飞重整花落谁家? 多个“接盘侠”浮出水面
  20. 关于在线评论有用性的论文研读笔记---41-50篇

热门文章

  1. pycharm配置python2.7.6环境_pycharm如何配置python环境
  2. 自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页
  3. windows7蓝牙怎么打开_windows7系统如何调整字体大小
  4. 计算机音乐数字乐谱生僻字,《生僻字》歌曲简谱
  5. java程序的可移植性
  6. php许愿墙mysql,许愿墙—许下你的愿望
  7. CSDN浏览器助手安装说明书
  8. 5G的主要业务场景:eMBB、URLLC、mMTC
  9. 还搞不懂负数怎么用二进制表示?看完这一篇就懂了
  10. SQL 数据初级查询—实验报告