请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

嵌入式天空

 找回密码
 我要注册

扫一扫,访问微社区

查看: 1064|回复: 0

Python中调用C语言

[复制链接]

344

主题

468

帖子

3963

积分

管理员

我是一个程序员

Rank: 9Rank: 9Rank: 9

积分
3963
发表于 2018-7-24 11:20:56 | 显示全部楼层 |阅读模式
Python语言的开发效率很高,但是运行效率相对于C/C++来说还是低了很多,* z; ^$ {1 @% L6 W% N9 B6 k
因此在开发过程中一般cpu密集型的算法需要用C/C++实现,以提高效率。* H' |7 A$ J6 W5 o7 G4 _
& H( y. E4 ^& |& \
下面介绍一种最简单的由Python调用C的方法(使用Python的ctypes模块)
2 x7 N/ e+ U# |! H# t$ ]( u$ c
6 s/ l5 Q4 T3 R+ _1.先编写C语言代码
* L$ e8 }! S$ o8 s3 i7 \5 k
  1. #include <stdio.h>
    + ?9 S. x1 K8 x$ N4 P1 h6 N1 R% z
  2.   & o- x; k% z8 W+ H* P
  3. int add(int a, int b)/ `$ O# \* o) O5 q% `" }
  4. {
    : G$ a5 B9 F( ]
  5.              return a + b;
    : D* h9 c2 e$ c' q5 ^$ R! s
  6. }
    ) g  f+ T) w3 n4 g

  7. ! ~8 B+ U! E, [, X  [9 m
  8. float sub(float a, float b)! {/ S( k3 r4 A9 E  L
  9. {; G* D0 T2 z+ h7 v* Z0 z
  10.             return a - b;
    % r2 F) g; u2 ~4 k7 g5 k7 j
  11. }
    8 c1 {( c- e+ e/ N
  12. 2 x! \( z! C7 f) x# f- }7 ]' A
  13. int setup(char *s)0 T1 R! a& F4 `' M7 ]9 U5 |& a
  14. {# H/ E# x0 L' s* R+ T
  15.             printf("args = %s\n", s);5 L4 L! v' j+ |  Z7 ^: O

  16. " H& e# R  J# K8 B0 r2 h6 }
  17.             return 0;  c; ^* u6 ~; @1 c& y
  18. }. ?7 o' A0 Z( z) S; m+ ~! [& z
复制代码
2.把C代码编译程动态库形式; u! P2 T8 Y: m& ^' ]
lzy@lzy-ZHAOYANG-E52-80:~/test/python_C$ gcc -fPIC -shared cal.c -o libcal.so
  S5 r8 e. b' I) U. ~+ v; u
% t1 x% e4 O3 G9 S- O
' q0 C+ ]& Y9 u# R- T9 r, m3.编写Python代码
: z( Q3 A2 F. p. O, M9 p
  1. #导入ctypes模块( E. O2 D; f8 }5 y
  2. from ctypes import *
    5 b2 _% Y, m( Y2 T5 K8 q
  3.   6 h, C; Q' l" r7 {0 n
  4. #加载C动态库
    ; W) v* ^7 L0 W: I2 F6 |
  5. cal = CDLL('./libcal.so')
    ( l! P' N2 R) [* F4 `

  6. , _: N7 P7 |: t3 ~4 z
  7. #调用动态库中的add方法; I: Q: ~8 ~) T& v+ p
  8. ret = cal.add(1, 2)
    3 t1 s& W1 O' [2 _5 ]/ B
  9. print(ret)  L, S+ s( c7 ]/ N3 H" A

  10. . I; t# B5 u7 m4 z$ s8 a
  11. #调用动态库中的setup方法) T& p+ W2 E9 X
  12. a = cal.setup('setup_test')1 @+ E9 x7 m8 w# ~8 v
  13. print(a)
    % B8 H2 U% X5 B8 B$ c* U9 d
  14. + s( g7 c+ a$ W; @. ^/ E
  15. #调用动态库中的sub方法,浮点类型的参数需要转换; O8 P. ^& [. p8 [! J; r% m2 y
  16. a = c_float(3.4)9 ?4 N3 Z; L! R+ G+ B# _0 \" I8 j8 S
  17. b = c_float(4.5)
    * _( w8 @3 G; O1 [4 u9 n9 d
  18. sub = cal.sub9 r& W: d) }4 F. k
  19. sub.restype = c_float
    " f3 q- g0 H) l$ {% ~5 [
  20. ret = sub(a, b)( ]: b: u+ C) O  B7 q
  21. print(ret); }! h& E4 g1 j+ ^! k
  22. : [/ ], Q! T& k9 H! A3 x
复制代码

! O2 S6 }! |9 p! W7 @, ~* r8 v% J; {- W9 Z+ a% ]
4.运行结果
6 n6 b. |' b3 D9 wlzy@lzy-ZHAOYANG-E52-80:~/test/python_C$ python python_test.py % Y' a: H/ C0 j! N
3
7 R7 A# P1 F3 y% u: Targs = setup_test3 k: ?# b+ n0 ?- M$ f
0
  z% T3 P6 E1 O' I! P, q-1.09999990463
9 F& e3 k* W" ~7 O
) e0 D# O+ @- e2 y" _* r/ p" J  s. H+ _4 U( k8 h% b

& i# J: U  Z; o/ {
最近很忙
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2019-8-25 18:01 , Processed in 0.076204 second(s), 36 queries .

Powered by Discuz! X3.2

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

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