自從發現Python的簡單之后,一些對效率要求不高的地方博主基本上就懶得用C之類的語言了。但是Python腳本的代碼保護就是個問題。
之前會考慮用C與Python混合編程,后來發現一種方法可以直接將.py封裝成.so庫文件,這是何等騷氣的操作。果斷分享。
一、准備工作
測試系統:debian 8;python版本:2.7.9。
1. 安裝gcc和python-dev:
sudo apt install gcc python-dev
2. 安裝cython,建議使用douban源:
sudo pip install cython -i https://pypi.douban.com/simple
二、實施
1. 我先准備了一個腳本:TestHello.py,里面有三個函數hello1(),hello2(),max(x, y)
1 # -*- coding: utf-8 -*- 2 3 def hello1(): 4 print 'Life is short, I use Python.' 5 6 7 def hello2(): 8 print 9 print 'Zen of Python' 10 print 'Beautiful is better than ugly.' 11 print 'Explicit is better than implicit.' 12 print 'Simple is better than complex.' 13 print 'Complex is better than complicated.' 14 print 15 16 17 def max(x, y): 18 return x if x > y else y 19 20 21 if __name__ == '__main__': 22 hello1() 23 hello2() 24 print max(100, 99)
2. 現在我要把這個腳本封閉起來,首先在新建一個setup.py:
1 from distutils.core import setup 2 from Cython.Build import cythonize 3 4 5 setup(ext_modules=cythonize(["TestHello.py"]))
這里需要說明以下幾點:
- setup.py與TestHello.py最好在同一個目錄下,如果需要轉換的文件很多,setup可以單獨放一個位置,但第5行cythonize()里應當使用文件的絕對路徑;
- 注意cythonize()的參數是一個list,也就是說,可以一次轉換多個腳本文件。
3. 開始轉換
python setup.py build_ext
4. 運行完成后,當前目錄會多出一個目錄build、一個文件TestHello.c:
可以看到./build/lib.linux-i686-2.7/TestHello.so就是我們需要的文件。(系統不同,目錄名稱會不一樣)
我這里直接在原目錄中測試一個新的腳本test.py。

1 from TestHello import * 2 3 hello1() 4 hello2() 5 print max(50, 64)
運行一下:
python test.py

雖然沒有TestHello.py,但是卻可以正常調用里面的函數。
大功告成!
P.S.:Windows 下如何將 .py 轉換成 .dll(動態鏈接庫文件)
Python 2.7:cython + MinGW gcc + Microsoft Visual C++ Compiler for Python 2.7 或者直接cython + VS/VC++
Python 3.x:cython + VS/VC++
步驟與linux下基本一致,申明一點,Windows下博主沒有測試,有興趣可以參考:
