设为首页收藏本站

嵌入式天空

 找回密码
 我要注册

扫一扫,访问微社区

最近看过此主题的会员

查看: 814|回复: 0

Python中调用C语言

[复制链接]

341

主题

465

帖子

3942

积分

管理员

我是一个程序员

Rank: 9Rank: 9Rank: 9

积分
3942
发表于 2018-7-24 11:20:56 | 显示全部楼层 |阅读模式
Python语言的开发效率很高,但是运行效率相对于C/C++来说还是低了很多,6 j/ m% z) f  k* R2 Q+ W: P/ \
因此在开发过程中一般cpu密集型的算法需要用C/C++实现,以提高效率。* y+ x. g, D: v! \" P$ M2 ]
4 z7 q* _6 b! Q# |1 F- i1 E! B) i6 \
下面介绍一种最简单的由Python调用C的方法(使用Python的ctypes模块)( ]/ h% ^9 k2 u* J/ ?; C
2 m) _) g2 s( ^$ p- q, q
1.先编写C语言代码# M) G2 ]  I0 E3 x( F0 ~" b& h
  1. #include <stdio.h>% y+ y6 B9 o/ C: E5 c/ G$ C
  2.   : a' r7 I" o6 f- h
  3. int add(int a, int b)
    3 I7 t! _* V# {" L; B
  4. {9 k1 T" J$ w' f  f( v
  5.              return a + b;5 e2 R5 {& [) \, D# z, P& g
  6. }
    4 l& i0 g4 p+ ?' }! Q% p# Z

  7. $ S6 d" Z+ e* t
  8. float sub(float a, float b)7 ^2 _3 h. @. z9 ?. y( q7 E! c; h
  9. {
    * a; ^3 @. ?; Z
  10.             return a - b;) F% c) a9 [: b4 U* y0 A; o
  11. }8 P7 O& s; S. _% v: V7 q5 K) Z2 V. j
  12. % `# u% r. s  U, m, @! k8 H/ o
  13. int setup(char *s)
    1 S$ S9 S9 j% Q. S
  14. {
    * u0 N9 ?- P% C5 x( o
  15.             printf("args = %s\n", s);( y# J3 B% [/ p9 S% e

  16. 1 {+ p% M2 C6 m& k( [& z( c
  17.             return 0;& d+ P& k1 f! R% g
  18. }
    1 ]/ R* r( N, S5 \3 x- U1 ?6 g3 N
复制代码
2.把C代码编译程动态库形式
* f' |& q. F1 |/ W/ jlzy@lzy-ZHAOYANG-E52-80:~/test/python_C$ gcc -fPIC -shared cal.c -o libcal.so
+ W- u# J$ S) @  Q! ], R! o
, l9 Z( g; W6 @* x0 b$ ~4 ]% m7 ^& R4 n9 C* }# Y$ w
3.编写Python代码/ q* T% v* ~8 x; U! c
  1. #导入ctypes模块- y( f5 G- _1 Q7 }
  2. from ctypes import *
    ' n: q; [& v# L# j- V& S9 p
  3.   ; H! H, w5 I5 K* }3 H
  4. #加载C动态库
    # ?+ I* U2 h" b, i' C
  5. cal = CDLL('./libcal.so')
    4 T8 _8 `( b0 T2 \
  6. 1 X4 P* e, V4 O" U4 E
  7. #调用动态库中的add方法& P" j2 y5 s9 Y3 @: ^" N
  8. ret = cal.add(1, 2)# t4 y1 }% [$ i6 W% t
  9. print(ret)
    1 e5 d4 @& q. l  V0 W

  10. 8 I; u" [, H$ ^+ A( J9 v
  11. #调用动态库中的setup方法, M5 y7 `/ c2 _0 m& }
  12. a = cal.setup('setup_test')
    5 n( `7 Q6 y; ~- I( s
  13. print(a)
    & c/ X$ ]; S- l
  14. 6 x3 d$ `9 I2 }$ X; d8 m2 P) D
  15. #调用动态库中的sub方法,浮点类型的参数需要转换& y2 @5 e) J1 M
  16. a = c_float(3.4)
    1 R/ m% o% }0 e! \3 G) x" T" K
  17. b = c_float(4.5)
    : f) ~$ j) n% k4 q3 }' i" T
  18. sub = cal.sub0 U) z" a: z5 ^2 B7 t# Q
  19. sub.restype = c_float
    ! R2 v. w7 K/ t
  20. ret = sub(a, b)
    . p" l+ `- h/ D7 y; n
  21. print(ret)
    : n- e- ?; S% S& U
  22. + l2 S2 o! N1 Y- d
复制代码
$ V# j' v3 ?' ]7 a& ^) b
5 {1 ~9 E5 O- B6 D$ ^  j  A
4.运行结果
: Z" t7 x! {3 \9 Y1 f+ z# Blzy@lzy-ZHAOYANG-E52-80:~/test/python_C$ python python_test.py 5 a% I& M4 z' {8 U) o# d1 F% `6 M2 D
3/ J, I" L) ^+ m, t/ s: `, m
args = setup_test
) W+ ]: `$ J# v& n0
% N9 j* m; b6 i: X% {% V2 Q-1.09999990463& ?* `& L- Q% i" ]$ [
5 ]$ y* A2 _1 i$ F, q
8 M$ I, y) H) `: C

' P9 F  F$ Y3 i' Y* K$ p
最近很忙
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

QQ|Archiver|手机版|小黑屋|EBMSKY Inc. ( 冀ICP备17022971号-1  

GMT+8, 2019-5-24 09:45 , Processed in 0.078631 second(s), 36 queries .

Powered by Discuz! X3.2

© 2014-2018 Comsenz Inc. 【嵌入式天空】设计

快速回复 返回顶部 返回列表