zoukankan      html  css  js  c++  java
  • Mac上把python源文件编译成so文件

    把python源文件编译成so文件

    前言

    实际上属于一种代码混淆/加密的技术,大家知道python的源文件放在那里,大家是都可以看的,不像C语言编译出来可以拿编译后的东西去运行,所以就出现了这种需求。原理相当于将python编译成c,然后再转成.so文件

    .so文件为动态连结库,可以在程序运行时动态链接,类似于windows的dll文件。

    在网上搜了一下,常用的有2种方法:

    • 通过gcc(make)来操作
    • 使用python来操作
    准备工作
    • 在目录下创建__init__.pyhello.py
    • hello.py 内容为:
    def hello():
        print "hello"
    
    使用python来操作
    • 安装所需库CPython,命令如下:
    pip install cython
    
    • 创建文件setup.py,内容如下:
    from distutils.core import setup
    from Cython.Build import cythonize
    setup(
        ext_modules = cythonize("hello.py")
    )
    
    • 执行setup.py文件
    python setup.py build_ext --inplace
    
    • 在当前目录下就生成了和当前目录同名的一个目录,进入目录即可看见so文件,打开so文件可见一些乱码,达到了加密的目的
    使用gcc来编译
    • 编译成c文件,完成后目录下多了hello.c
    cython hello.py
    
    • 编译成hello.o, 完成后目录下多了hello.o
    gcc -c -fPIC -I/usr/include/python2.7/ hello.c
    
    • 编译成so文件
    gcc -undefined dynamic_lookup -shared hello.o -o hello.so
    
    • 部分博客写的命令没有加-undefined dynamic_lookup的参数,会报错,提示
    Undefined symbols for architecture x86_64
    

    参考https://github.com/cloudwu/skynet_sample/issues/9 加上那个参数就好了

    • 也有说加-lstdc++参数使用c++标准库就可以的,但是我尝试了不成功,依然报同样的错误
    gcc -lstdc++ -v -shared hello.o -o hello.so
    
    验证

    在so文件目录下,进入python终端,然后尝试使用一下这个模块就可以了,如下:

    >>> from hello import hello
    >>> hello()
    hello
    
    参考
  • 相关阅读:
    论抱怨
    GitHub开源的10个超棒后台管理面板
    RESTful API 最佳实践
    理解RESTful架构
    redis 数据类型详解 以及 redis适用场景场合
    redis的应用场景 为什么用redis
    composer install 出现的问题
    什么是反向代理
    电脑 DNS纪要
    ajax请求处理概要
  • 原文地址:https://www.cnblogs.com/wswang/p/9298773.html
Copyright © 2011-2022 走看看