python脚本加密

目标:将python编译成so文件

1.安装cython,gcc
2.python代码需要格式化(空格不能多,文件名不能为数字)
3.将需要转化的python文件放在一个目录中(例:a/)
4.执行python setup.py a/ (会在当前目录产生一个python_so文件夹,此文件夹存放的就是转化后的so文件)
5.执行 python touch.py a/ (会将源代码清空,并写入如何导入对应的so文件)
6.将python_so下文件和源文件放在一起即可和之前一样使用。

注意事项:
1.第4步如有报错均为python代码没有格式化,根据提示可以知道详细信息。
2.当前主机编译出来的so文件,理论上只能在相同环境的主机上使用。
3.setup.py和touch.py如下


> setup.py

	```
	
	#-* -coding: UTF-8 -* -
	
	"""
	执行前提:
	    系统安装python-devel 和 gcc
	    Python安装cython
	
	编译整个当前目录:
	    python py-setup.py
	编译某个文件夹:
	    python py-setup.py BigoModel
	
	生成结果:
	    目录 python_so 下
	
	"""
	
	import sys, os, shutil, time
	from distutils.core import setup
	from Cython.Build import cythonize
	
	starttime = time.time()
	currdir = os.path.abspath('.')
	parentpath = sys.argv[1] if len(sys.argv)>1 else ""
	setupfile= os.path.join(os.path.abspath('.'), __file__)
	build_dir = "python_so"
	build_tmp_dir = build_dir + "/temp"
	
	def getpy(basepath=os.path.abspath('.'), parentpath='', name='', excepts=(), copyOther=False,delC=False):
	    """
	    获取py文件的路径
	    :param basepath: 根路径
	    :param parentpath: 父路径
	    :param name: 文件/夹
	    :param excepts: 排除文件
	    :param copy: 是否copy其他文件
	    :return: py文件的迭代器
	    """
	    fullpath = os.path.join(basepath, parentpath, name)
	    for fname in os.listdir(fullpath):
	        ffile = os.path.join(fullpath, fname)
	        #print basepath, parentpath, name,file
	        if os.path.isdir(ffile) and fname != build_dir and not fname.startswith('.'):
	            for f in getpy(basepath, os.path.join(parentpath, name), fname, excepts, copyOther, delC):
	                yield f
	        elif os.path.isfile(ffile):
	            ext = os.path.splitext(fname)[1]
	            if ext == ".c":
	                if delC and os.stat(ffile).st_mtime > starttime:
	                    os.remove(ffile)
	            elif ffile not in excepts and os.path.splitext(fname)[1] not in('.pyc', '.pyx'):
	                if os.path.splitext(fname)[1] in('.py', '.pyx') and not fname.startswith('__'):
	                    yield os.path.join(parentpath, name, fname)
	                elif copyOther:
	                        dstdir = os.path.join(basepath, build_dir, parentpath, name)
	                        if not os.path.isdir(dstdir): os.makedirs(dstdir)
	                        shutil.copyfile(ffile, os.path.join(dstdir, fname))
	        else:
	            pass
	
	#获取py列表
	module_list = list(getpy(basepath=currdir,parentpath=parentpath, excepts=(setupfile)))
	try:
	    setup(ext_modules = cythonize(module_list),script_args=["build_ext", "-b", build_dir, "-t", build_tmp_dir])
	except Exception as e:
	    print (e)
	else:
	    module_list = list(getpy(basepath=currdir, parentpath=parentpath, excepts=(setupfile), copyOther=True))
	module_list = list(getpy(basepath=currdir, parentpath=parentpath, excepts=(setupfile), delC=True))
	if os.path.exists(build_tmp_dir): shutil.rmtree(build_tmp_dir)
	print ("complate! time:", time.time()-starttime, 's')


>touch.py

```
# -*- coding: utf-8 -*-   
import sys      
import os        
def file_name(file_dir):   
    for root, dirs, files in os.walk(file_dir):  
        #print(root) #当前目录路径  
        #print(dirs) #当前路径下所有子目录  
        print(files) #当前路径下所有非目录子文件
    for i in files:
        (filename, extension) = os.path.splitext(i)
        txt=('#!/usr/bin/python\nimport sys\nsys.path.append("./python_so/")\nimport %s'%(filename))
        f = open(file_dir+i, "w")
	f.write(txt)
        f.close()
file_name(sys.argv[1])

```

你可能感兴趣的:(linux)