天天看點

Mac上把python源檔案編譯成so檔案

把python源檔案編譯成so檔案

前言

實際上屬于一種代碼混淆/加密的技術,大家知道python的源檔案放在那裡,大家是都可以看的,不像C語言編譯出來可以拿編譯後的東西去運作,是以就出現了這種需求。原理相當于将python編譯成c,然後再轉成.so檔案

.so檔案為動态連結庫,可以在程式運作時動态連結,類似于windows的dll檔案。

在網上搜了一下,常用的有2種方法:

  • 通過gcc(make)來操作
  • 使用python來操作
準備工作
  • 在目錄下建立

    __init__.py

    hello.py

  • hello.py

    内容為:
def hello():
    print "hello"
           
  • 安裝所需庫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
           
參考
  • http://www.fidding.me/article/20
  • http://www.cnblogs.com/vamei/archive/2013/04/04/2998850.html
  • https://blog.csdn.net/linshenyuan1213/article/details/72677246