V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

Python 调用 c 这两种做法的不同

  •  
  •   zxCoder · 2020-09-09 22:35:10 +08:00 · 1288 次点击
    这是一个创建于 1534 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1 直接编译成一个可执行文件,然后 python 里执行命令 ./main -xx xxxx,传几个简单的参数 2 编译成动态库,然后 python 去调用这个动态库,再去执行对应的函数

    这两种方法有很大区别吗?第 1 种很少见的原因是因为安全性问题吗?还是还有其他的问题?

    第 1 条附言  ·  2020-09-10 09:06:11 +08:00
    前面之所以用 python 是看到 python 封装 c 好像比较方便,但是如果目前的开发者只会 java,似乎第二种方法会很麻烦,只能用 jna 去调用。
    而且还有个权限的问题,jna 如何以 root 权限去执行动态库里的函数?
    9 条回复    2020-09-10 10:25:05 +08:00
    weyou
        1
    weyou  
       2020-09-09 23:18:26 +08:00 via Android
    第一种也不少见啊, 得看使用场景了,其实就是把 Python 当作 shell 用呗。这种方式受限于命令行参数,复杂一点的结构化参数就比较难办,需要参数来回转换,而且需要起另外的进程,此外获取此进程的返回值也没有第二种方法直接,也需要自行转换。如果是高频度的函数调用,这种方式显然比第二种效率低下。
    billlee
        2
    billlee  
       2020-09-09 23:23:04 +08:00
    fork-exec 的开销还是比 function call 大得多的
    ipwx
        3
    ipwx  
       2020-09-09 23:41:23 +08:00
    恰恰相反,如果考虑安全性或者环境等乱七八糟的事情,第一种是很好的选择。

    选择第二种是为了效率。启动一个新进程开销特别大。
    hakono
        4
    hakono  
       2020-09-09 23:44:02 +08:00 via Android
    第二种,开发调试起来是噩梦
    ysc3839
        5
    ysc3839  
       2020-09-10 00:45:06 +08:00 via Android
    区别算大吧,前者需要启动新进程,后者是在当前进程中执行的。
    前者很少见可能是因为不便于传递数据。
    SingeeKing
        6
    SingeeKing  
       2020-09-10 00:49:29 +08:00 via iPhone
    第一种一方面涉及创建进程,另一方面交互很受限
    Tony042
        7
    Tony042  
       2020-09-10 01:59:17 +08:00
    @hakono 第二种用 C 写好,把 C 的函数都测试好,直接用 pybind11 包一下不就可以了,我感觉 C 这边的 unit test 做好,调试应该不费劲
    swulling
        8
    swulling  
       2020-09-10 07:21:13 +08:00 via iPhone
    第一种开销比较大,看频率了
    频率不高可以用第一种
    zxCoder
        9
    zxCoder  
    OP
       2020-09-10 10:25:05 +08:00
    @swulling 那如果是把 c 部分再封装一个 http 或者 rpc 服务来调用,这种方法对比前两种方法效率如何呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4821 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:44 · PVG 17:44 · LAX 01:44 · JFK 04:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.