91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python調用c函數的方法

發布時間:2020-09-02 13:43:52 來源:億速云 閱讀:162 作者:小新 欄目:編程語言

小編給大家分享一下python調用c函數的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

linux版的動態庫

寫個簡單的C代碼,test.c

#include <stdio.h>
#include <stdlib.h>
char * printStr(const char *p,const char *q)
{
    printf("%s",p);
    printf("%s",q);
    return "djstava";
}

通過以下命令編譯成動態鏈接庫

gcc -fPIC -shared -o libtest.so test.c

python3中調用

要調用C庫中的函數,需要用到ctypes這個模塊

# -*- coding: utf-8 -*-
from ctypes import *
handle = cdll.LoadLibrary('libtest.so')
func = handle.printStr
func.argtypes = (c_char_p,c_char_p)
func.restype = c_char_p
tmp = handle.printStr("hello".encode("utf-8"),"world".encode("utf-8"))
print(tmp.decode("utf-8"))

程序執行結果:

helloworld

程序解釋

func.argtypes = (c_char_p,c_char_p)
func.restype = c_char_p

這2句是分別設置參數數據類型和返回值類型,如果不進行設置,直接調用的話,參數可以正常接收,但是返回值永遠是個int值,傳入的字符串參數必須為encode("utf-8"),否則在c庫中僅會打印為首字符。

handle = cdll.LoadLibrary('libtest.so')
ret = handle.printStr("hello".encode("utf-8"),"world".encode("utf-8"))

windows版的動態庫

Visual Studio編譯dll,在需要拋出的方法前加入__declspec(dllexport), 比如下面C代碼:

__declspec(dllexport) unsigned int crc32( const unsigned char *s, unsigned int len)
{
  unsigned int i;
  unsigned int crc32val=0xffffffff;
printf("len==%d\n",len);
  for (i = 0;  i < len;  i ++)
      crc32val =  crc32_tab[(crc32val ^ s[i]) & 0xff] ^ ((crc32val >> 8)&0x00FFFFFF);
  return ~crc32val;
}

然后打開VS X64工具命令行提示符,進入到C源碼目錄,分別執行以下兩條命令,第一條命令是生成目標文件.obj,第二天命令是鏈接目標文件,生成動態庫。

cl /c crc.c
link /dll crc.obj

至此,dll文件就生成了,它就是我們需要的動態鏈接庫,dll的調用跟so的方法一樣。

看完了這篇文章,相信你對python調用c函數的方法有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嫩江县| 旌德县| 宝兴县| 仪征市| 泽普县| 眉山市| 绍兴县| 广宗县| 合川市| 荥阳市| 鄯善县| 如皋市| 钟山县| 体育| 麻城市| 塔城市| 安庆市| 云阳县| 略阳县| 黄骅市| 丰城市| 会同县| 惠东县| 炉霍县| 孝感市| 新蔡县| 宁阳县| 金湖县| 开化县| 新晃| 伊宁市| 广宁县| 安泽县| 饶阳县| 班戈县| 雅江县| 邳州市| 武清区| 小金县| 论坛| 禹城市|