初步学习python调用C++代码

ubuntu下用python导入c++写的动态链接库

(当前状态:学习图嵌入,遇到metapath2ec的c++代码,想要用python调用,现在知道的方法是将c++生成动态链接库,然后用python直接调用库的函数(要把main当成普通函数来看待,没有什么c++的从主函数执行的))

下面三个关于生成库的链接(就看看)

https://blog.csdn.net/qq_33850438/article/details/52014399

https://www.cnblogs.com/johnice/archive/2013/01/17/2864319.html

https://blog.csdn.net/glw0223/article/details/89642244

下面这个就很有用了!有怎么导入的具体步骤解释和代码

https://www.cnblogs.com/spxcds/p/5345345.html

(gcc和g++什么玩意的小问题)https://stackoverflow.com/questions/16440412/wrapping-c-using-ctypes-undefined-symbol

1. 生成库

1.1静态库(没用到,just记录一下)

gcc -c metapath2vec.cpp

gcc -c distance.c

ar -rsv libtest.a metapath2vec.o distance.o

ranlib libtest.a

1.2动态库

g++ metapath2vec.cpp -fPIC -shared -o libmetapath.so #貌似名字前面必须是lib开头的
g++ distance.c -fPIC -shared -o libdistance.so (这个没用到?)

2. 导入

2.1 准备

我用的c++代码有main函数,那个argv是char**类型,传参很多问题!大约查了3个小时资料终于可以正常传参了。下面是有用了链接

https://www.cnblogs.com/spxcds/p/5345345.html 这是一个基础教程

https://tieba.baidu.com/p/5213249142?red_tag=1935817052 这是一个思路,虽然对于我不好用

https://stackoverflow.com/questions/37888565/python-3-5-ctypes-typeerror-bytes-or-integer-address-expected-instead-of-str 这里说明了python版本遇到的问题!

https://www.programcreek.com/python/example/1243/ctypes.c_char_p 这是Python ctypes.c_char_p() Examples(有助于了解)

!!!最后依靠下面的博客解决的

https://blog.csdn.net/killboss12/article/details/86314883

2.2 以下是python调用so动态库的代码

 

#coding=utf8
from ctypes import *

cur = cdll.LoadLibrary('./a.so')

argc = 11
cur.main.argtypes=[c_int, POINTER(c_char_p)]#设置格式

string_buffers = [create_string_buffer(64) for i in range(1)]
pointers = (c_char_p*5)(*map(addressof, string_buffers))
#上面一行我是黄的,不知道为什么,反正能跑

pointers[0]='23'.encode('utf-8')#python3.7的c_char_p需要编码-->bytes,str类型不行
pointers[1]='23'.encode('utf-8')
pointers[2]='ddd'.encode('utf-8')
pointers[3]='rfgh'.encode('utf-8')
pointers[4]='tyhnj'.encode('utf-8')
#pointers[4]=c_char_p('tyhnj'.encode('utf-8'))也是可以的

cur.main(31, pointers)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值