python将py编译成so方法

摘要:
=build_dirandnotfname.startswith('.'):forfingetpy(basepath,os.path.join(parentpath,name),fname,excepts,copyOther,delC):yieldfelifos.path.isfile(ffile):ext=os.path.splitext(fname)[1]ifext==".c":ifdelCandos.stat(ffile).st_mtime˃starttime:os.remove(ffile)elifffilenotinexceptsandos.path.splitext(fname)[1]notin('.pyc','.pyx'):ifos.path.splitext(fname)[1]in('.py','.pyx')andnotfname.startswith('__'):yieldos.path.join(parentpath,name,fname)elifcopyOther:dstdir=os.path.join(basepath,build_dir,parentpath,name)ifnotos.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])exceptException,ex:print"error!
python将py编译成so方法
转载 2017年09月08日 10:13:29 标签:pyd /ipython 849python:让源码更安全之将py编译成so
应用场景

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

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

准备工作

  环境是可为linux/centos,我Windows10本地是Bash on Ubuntu onWindows,用起来很方便,命令行打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,内容如下

fromdistutils.core import setup
fromCython.Build import cythonize

setup(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
fromyour_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
fromdistutils.core import setup
fromCython.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 ="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 inos.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 notos.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])
exceptException, 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将py编译成so方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。Oracle 递归拼接字段下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python websocket Django 实时消息推送

概述: WebSocket 是什么? WebSocket 是 HTML5 提供的一种浏览器与服务器间进行全双工通讯的协议。依靠这种协议可以实现客户端和服务器端 ,一次握手,双向实时通信。 WebSocket 服务端: 用的是 dwebsocket,安装命令pip installdwebsocket. WebSocket 基本方法: 1.request.i...

argparse 命令含参数模块

argparse是python的一个命令行参数模块,可以解析命令行参数,生成帮助等。 你可以这样使用它: Python代码 #!/usr/bin/python fromargparseimportArgumentParser p=ArgumentParser(usage='itisusagetip',description='thisisates...

Python读写excel练习_去除excel中乱码行,并添加列

需求: 把app_student.xls里面的数据, 1、如果这一行数据里面有乱码(及包含?),那么就删掉 2、再加上一列,是否毕业 3、如果班级是天蝎座的话,毕业这一列写成毕业 4、其他班级的写成未毕业 原始数据: 实现: import xlrd,xlwt EXCEL_NAME = 'app_student.xls' def delete_messy_...

python 3.6 链接mssql 进行数据操作

#!/usr/bin/env python # -*- coding: UTF-8 -*- import pymssql class MSSQL(object): ''' 对pymssql的简单封装 pymssql库,该库到这里下载:http://www.lfd.uci.edu/~gohlke/pythonl...

python操作Excel模块openpyxl

1、 安装 pip install openpyxl 想要在文件中插入图片文件,需要安装pillow,安装文件:PIL-fork-1.1.7.win-amd64-py2.7.exe · font(字体类):字号、字体颜色、下划线等 · fill(填充类):颜色等 · border(边框类):设置单元格边框 · alignment(位置类):对齐方式 · ...

Spark官方文档翻译(一)~Overview

Spark官方文档翻译,有问题请及时指正,谢谢。 Overview页 http://spark.apache.org/docs/latest/index.html Spark概述 Apache Spark 是一个快速的,分布式集群计算系统.它提供了高等级的针对 Java, Scala, Python and R的API接口, 他还是一个优秀的图处理引...