在linux中使用python调用Windows下的go文件

linux下的python环境调用Windows下的go文件

    • 前言
    • 环境描述
    • 生成.so文件
    • python调用.so文件测试

前言

本文讲述的是在windows环境下编写的go项目,转为linux环境下python可以使用的.so文件的过程,供给linux环境下的python使用。本文是基于我自己目前所做项目的背景之下,我简单描述一下我此时的工作:我在做一个匹配linux命令的一个功能,是在Windows下编写的go代码,但是需要提供给公司小伙伴在linux中的python环境下能够使用的一个类似于功能接口的东西,使得公司小伙伴可以通过linux下的python文件中调用我在Windows环境下编写的go代码。

环境描述

OS:Windows10、linux version 3.10.0-327.el7.x86_64(CentOS,linux的版本号可以通过uname -r进行查看)
shell环境:XShell 6
go:go1.15.3.windows-amd64
python:python 2.7.5

生成.so文件

  • 在Windows下将go项目打包成.Zip文件,上传至linux下:
  1. 使用rz -be 命令上传打包好的.Zip文件(此处我上传的文件名为amf.zip):
    在这里插入图片描述
  2. 使用unzip -o amf.zip文件解压缩到了当前目录下:
    在linux中使用python调用Windows下的go文件_第1张图片
  3. 我的go文件main.go的路径为/root/amf/main.go,此时,进入go的编译环境,我的环境在/usr/local/go/bin
    在这里插入图片描述
  • 编译我的main.go并转为.so文件
  1. 编译go文件的命令为:./go build /root/amf/main.go
  2. 验证可以编译成功后,就可以使用./go build -buildmode=c-shared -o /root/amf/matchCommand.so /root/amf/main.go生成.so文件,此处.so文件我放在main.go的同级目录之下。可以进入该目录查看是否生成成功:
    在linux中使用python调用Windows下的go文件_第2张图片可以看到,此时go文件已经转为了一个.h和一个.so后缀的两个文件。

python调用.so文件测试

  1. 此时可以创建一个新的文件夹,用于测试.so文件是否可以被python的解释器编译(我创建了一个command_call文件):
    在这里插入图片描述
  2. 我将生成的.so.h文件已经我项目中需要的数据(两个json)文件都拷贝进了command_call文件里,我使用的还是先前描述的方法,把我的数据解压到了command_call文件夹中:
    在linux中使用python调用Windows下的go文件_第3张图片

其次是将.so.h文件拷贝到了这个command_call文件夹下,目前我的测试文件夹下的文件有:
在这里插入图片描述包括了.so文件、.h文件、两个数据文件(path.json以及linux_cmd.json文件)、还有一个测试文件test.py(测试文件可以根据自己的需求进行编写):

  1. 使用python test.py就可以执行文件了:
    在这里插入图片描述
    注意:如果原来的go文件涉及路径什么的,记得更改路径,因为Windows下的路径表示方法和linux下的不一样。
    我的test.py测试文件代码格式如下,仅供参考(可以参考一下抬头与引用.so文件,传参与返回值的类型之类的问题可以参考我的之前的一篇博文后半部分的讲解:https://blog.csdn.net/weixin_44283446/article/details/110632111):
# !/usr/bin/python
# -*- coding: utf-8 -*-
import ctypes
# 导入.so文件中的matchCommand
matchCommand = ctypes.CDLL("./matchCommand.so").matchCommand
# 设置期望的传参类型
matchCommand.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
# 设置期望的返回结果类型
os_type = "linux"
os_type = os_type.encode("utf-8")
linux_cmd = "john --wordlist"
linux_cmd = linux_cmd.encode("utf-8")
matchCommand.restype = ctypes.c_char_p
matchCommand(os_type, linux_cmd)
~                                   

至此,已经可以在Linux环境下的python调用Windows环境下的go代码了,描述过程中若有不足之处,请多多指正^_^

你可能感兴趣的:(go,python,linux,python,linux,go)