保护你的Python源代码

    自从发现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 bulid_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,但是却可以正常调用里面的函数。

大功告成!

猜你喜欢

转载自www.cnblogs.com/cbdeng/p/12061103.html