原文: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文件待编译,内容如下

#-* -coding: UTF-8 -* -
__author__ = 'Arvin'class test:def say(self):print 'hello'

  新建setup.py,内容如下

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

  在bash中执行

cd testing
python setup.py build_ext

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

  

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

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

集成编译

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

  做了以下内容:

    1.文件夹编译

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

    3.删除编译的temp文件夹

#-* -coding: UTF-8 -* -
__author__ = 'Arvin'import sys, os, shutil, time
from distutils.core import setup
from Cython.Build import cythonizestarttime = 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 = "build"
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,fileif 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 felif 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, ex:print "error! ", ex.message
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'

注意问题

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

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

  3.使用时注意权限控制

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

python编译so相关推荐

  1. python 编译exe

    Python编译成exe 1.安装pyinstaller pip install pyinstaller pip install packaging 2.编译 pyinstaller -F -w ga ...

  2. python编译exe文件太大了_python编译windows下可执行的exe文件

    python编译windows下可执行的exe文件的操作流程: 1.在安装python环境的windows下,安装 pyinstaller,请在dos下执行如下命令: pip install pyin ...

  3. python编译后的pyd爆破

    最近接触一个国外某app的协议软件,是python3.8写的,它把关键模块都编译成了pyd,然后使用pyinstaller打包发布给用户.软件启动后检查机器码,然后就需要输入授权码才可使用,看着很是恼 ...

  4. python编译为机器码_Python FAQ2-python代码编译问题

    本篇是关于py2.7.9-docs的FAQ.pdf中关于python编译的问题"3.13 Can Python be compiled to machine code, C or some ...

  5. python编译成exe有意义吗_python工程编译成EXE

    前言 python编译成EXE文件后,可以独立使用.亲测,一个复杂的python工程包含多个包多个模块,可以生成exe文件. 目的 windows下将整个python工程编译成单个EXE或者单个目录带 ...

  6. python ubuntu18.04 sublime_Ubuntu下Sublime配置python编译环境及新手使用指导:

    Sublime下配置python编译环境及搭建虚拟环境:(windows下大致相同) 1.编译环境配置 2019-3-6更新教程,发现好像 官方网址打不开了,要改一下源才行. 解决办法: 点击 Pre ...

  7. python编译so_Mac上把python源文件编译成so文件

    把python源文件编译成so文件 前言 实际上属于一种代码混淆/加密的技术,大家知道python的源文件放在那里,大家是都可以看的,不像C语言编译出来可以拿编译后的东西去运行,所以就出现了这种需求. ...

  8. 为什么python编译fourth = raw.input(‘Year: ‘)[3]时会报错

    最近在学习Python,我用的是教材是:Python基础教程(第二版)作者是[挪]Magnus Lie Hetland 由司维 增军崴 谭颖华翻译.我现在使用的Python版本为:Python 3.8 ...

  9. python安装c编译的软件_Notepad++配置C/C++、C#、Java、Python编译环境详细教程

    如果只是测试小程序可以用这种方法 比较方便,如果对于大程序建议使用专业的IDE. 经常需要写一些小程序来运行,又不想运行Visual Studio.Eclipse这样的环境,而Notepad++是一个 ...

  10. 为Notepad++配置C/C++、C#、Java、Python编译环境

    本文转自:http://blog.csdn.net/freewaywalker/article/details/8005468 如果只是测试小程序可以用这种方法 比较方便,如果对于大程序建议使用专业的 ...

最新文章

  1. java TreeMap用法
  2. 转载: Qt 学习之路 2归档
  3. OCR文字识别软件的快速任务功能如何用
  4. ​​​​​​​2016最新CocoaPods安装与使用
  5. cacti 整合nagios,以及总是off处理办法!
  6. axios教程01-基本使用流程
  7. .NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记
  8. 20165212 预备作业3 Linux安装及学习
  9. linux的运行级别如何更改成6,把Linux运行级别设置为6后如何解决的经验分享
  10. 企业微信添加机器人播报天气
  11. 直接调用高德地图_高德上线“充电地图”功能 覆盖全国96%充电桩信息
  12. 第七章:【UCHome二次开发】模板语法说明
  13. Xtreme9.0 - Block Art 线段树
  14. 微信小程序教程笔记4
  15. INSTALL_FAILED_TEST_ONLY的解决办法
  16. 【物联网控制技术】--第一章--【自动控制】【反馈控制】【调节过程】【系统要求】【典型的外部输入信号】
  17. 【Java基础知识 8】String、StringBuilder、StringBuffer详解
  18. 基于Vue的电商后台管理系统(2)
  19. Linq查找最大值max最小值min效率比较
  20. 音乐播放器制作 (HTML + CSS + JavaScript)

热门文章

  1. 线程同步----递归锁
  2. Linux中的可重入函数和不可重入函数
  3. Android中实现双击屏幕跳转
  4. 理解Linux的性能
  5. linux命令vgdisplay提示权限不足,linux常用命令总结
  6. 下载python的步骤ios_下载及安装Python详细步骤
  7. python重要吗-毫无基础,商英专业,Python真的有用吗?
  8. php标题 栏目不显示title,DEDECMS专题列表页不显示title的解决方法
  9. nginx增加php支持,Nginx启用php支持
  10. html动态报警图片,报警记录.html