python编译so

举报
风吹稻花香 发表于 2021/06/06 00:15:23 2021/06/06
【摘要】 原文:https://www.cnblogs.com/ke10/p/py2so.html python:让源码更安全之将py编译成so 应用场景   Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,使用其开发产品快速高效。   python的解释特性是将py编译为独有的二进制编码pyc文件,然后对pyc中的指令进行解释执行,但是pyc的反编译...

原文:https://www.cnblogs.com/ke10/p/py2so.html

python:让源码更安全之将py编译成so

应用场景

  Python是一种面向对象的解释型计算机程序设计语言,具有丰富和强大的库,使用其开发产品快速高效。

  python的解释特性是将py编译为独有的二进制编码pyc文件,然后对pyc中的指令进行解释执行,但是pyc的反编译却非常简单,可直接反编译为源码,当需要将产品发布到外部环境的时候,源码的保护尤为重要.

准备工作

  环境是可为linux/centos,我Windows10本地是Bash on Ubuntu on Windows,用起来很方便,命令行打bash即进入命令行

  思路是先将py转换为c代码,然后编译c为so文件

  所以要安装以下内容

python 安装:cython

pip install cython

linux 安装:python-devel,gcc

yum install python-devel

yum install gcc

 

初步编译

  在testing文件夹下有your_file.py文件待编译,内容如下


  
  1. #-* -coding: UTF-8 -* -
  2. __author__ = 'Arvin'
  3. class test:
  4. def say(self):
  5. print 'hello'

  新建setup.py,内容如下


  
  1. from distutils.core import setup
  2. from Cython.Build import cythonize
  3. setup(ext_modules = cythonize(["your_file.py"]))

  在bash中执行


  
  1. cd testing
  2. python setup.py build_ext

 

  运行后会生成build文件夹,如下,lib.linux-x86_64-2.7下就是我们想要的.so文件

  

  现在so文件就可以像普通py文件一样导入了


  
  1. cd build/lib.linux-x86_64-2.7/
  2. python
  3. from your_file import test
  4. test().say()

 

集成编译

  最新代码github:https://github.com/ArvinMei/py2so.git

  做了以下内容:

1.文件夹编译

2.删除编译出的.c文件

3.删除编译的temp文件夹

 


  
  1. #-* -coding: UTF-8 -* -
  2. __author__ = 'Arvin'
  3. import sys, os, shutil, time
  4. from distutils.core import setup
  5. from Cython.Build import cythonize
  6. starttime = time.time()
  7. currdir = os.path.abspath('.')
  8. parentpath = sys.argv[1] if len(sys.argv)>1 else ""
  9. setupfile= os.path.join(os.path.abspath('.'), __file__)
  10. build_dir = "build"
  11. build_tmp_dir = build_dir + "/temp"
  12. def getpy(basepath=os.path.abspath('.'), parentpath='', name='', excepts=(), copyOther=False,delC=False):
  13. """
  14. 获取py文件的路径
  15. :param basepath: 根路径
  16. :param parentpath: 父路径
  17. :param name: 文件/夹
  18. :param excepts: 排除文件
  19. :param copy: 是否copy其他文件
  20. :return: py文件的迭代器
  21. """
  22. fullpath = os.path.join(basepath, parentpath, name)
  23. for fname in os.listdir(fullpath):
  24. ffile = os.path.join(fullpath, fname)
  25. #print basepath, parentpath, name,file
  26. if os.path.isdir(ffile) and fname != build_dir and not fname.startswith('.'):
  27. for f in getpy(basepath, os.path.join(parentpath, name), fname, excepts, copyOther, delC):
  28. yield f
  29. elif os.path.isfile(ffile):
  30. ext = os.path.splitext(fname)[1]
  31. if ext == ".c":
  32. if delC and os.stat(ffile).st_mtime > starttime:
  33. os.remove(ffile)
  34. elif ffile not in excepts and os.path.splitext(fname)[1] not in('.pyc', '.pyx'):
  35. if os.path.splitext(fname)[1] in('.py', '.pyx') and not fname.startswith('__'):
  36. yield os.path.join(parentpath, name, fname)
  37. elif copyOther:
  38. dstdir = os.path.join(basepath, build_dir, parentpath, name)
  39. if not os.path.isdir(dstdir): os.makedirs(dstdir)
  40. shutil.copyfile(ffile, os.path.join(dstdir, fname))
  41. else:
  42. pass
  43. #获取py列表
  44. module_list = list(getpy(basepath=currdir,parentpath=parentpath, excepts=(setupfile)))
  45. try:
  46. setup(ext_modules = cythonize(module_list),script_args=["build_ext", "-b", build_dir, "-t", build_tmp_dir])
  47. except Exception, ex:
  48. print "error! ", ex.message
  49. else:
  50. module_list = list(getpy(basepath=currdir, parentpath=parentpath, excepts=(setupfile), copyOther=True))
  51. module_list = list(getpy(basepath=currdir, parentpath=parentpath, excepts=(setupfile), delC=True))
  52. if os.path.exists(build_tmp_dir): shutil.rmtree(build_tmp_dir)
  53. print "complate! time:", time.time()-starttime, 's'

 

 

注意问题

  1.编译后执行需要相同的python版本和编码

  2.py中使用__file__内置变量的文件编译后调用时会出问题,暂时没有解决,还需要使用pyc代替

  3.使用时注意权限控制

 

转载需注明出处:http://www.cnblogs.com/ke10/p/py2so.html

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/95753960

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。