python文件编译为so_Mac上把python源文件编译成so文件

把python源文件编译成so文件

前言

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

.so文件为动态连结库,可以在程序运行时动态链接,类似于windows的dll文件。

在网上搜了一下,常用的有2种方法:

通过gcc(make)来操作

使用python来操作

准备工作

在目录下创建__init__.py和hello.py

hello.py 内容为:

def hello():

print "hello"

使用python来操作

安装所需库CPython,命令如下:

pip install cython

创建文件setup.py,内容如下:

from distutils.core import setup

from Cython.Build import cythonize

setup(

ext_modules = cythonize("hello.py")

)

执行setup.py文件

python setup.py build_ext --inplace

在当前目录下就生成了和当前目录同名的一个目录,进入目录即可看见so文件,打开so文件可见一些乱码,达到了加密的目的

使用gcc来编译

编译成c文件,完成后目录下多了hello.c

cython hello.py

编译成hello.o, 完成后目录下多了hello.o

gcc -c -fPIC -I/usr/include/python2.7/ hello.c

编译成so文件

gcc -undefined dynamic_lookup -shared hello.o -o hello.so

部分博客写的命令没有加-undefined dynamic_lookup的参数,会报错,提示

Undefined symbols for architecture x86_64

参考https://github.com/cloudwu/skynet_sample/issues/9 加上那个参数就好了

也有说加-lstdc++参数使用c++标准库就可以的,但是我尝试了不成功,依然报同样的错误

gcc -lstdc++ -v -shared hello.o -o hello.so

验证

在so文件目录下,进入python终端,然后尝试使用一下这个模块就可以了,如下:

>>> from hello import hello

>>> hello()

hello

参考

python程序编译成exe文件

最近越来越喜欢使用python写工具.使用的时候,发现程序内部成员python安装目录常常不同,如果用bat双击执行,常常需要修改从svn上down下来的bat文件中python.exe的路径.而给策 ...

如何将python源文件打包成exe文件

PyInstaller是一个十分有用的第三方库,它能够在Windows.Linux.Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包,Python 程序可以在没有安装 Py ...

将python源文件打包成exe文件

pyinstaller 库的使用PyInstaller是一个十分有用的第三方库,它能够在Windows.Linux.Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包,Pyt ...

mac 上的 python

1.mac 上的 python 自己感觉很乱 1.额外安装的 自带的 python27-apple /System/Library/Frameworks/Python.framework/Versio ...

Python工程编译成跨平台可执行文件(.pyc)

原文:https://blog.csdn.net/zylove2010/article/details/79593655 在某些场景下,若不方便将python编写的源码工程直接给到其他人员,则可以将p ...

晓莲说-何不原创:如何通过jad把class批量反编译成java文件

背景:前几天在项目开发的时候遇到一个问题,那就是利用myeclipse编写好的一个项目打包成jar包后上传部署到服务器里,之后本地的项目被自己改来改去出现了一些问题,想着把上传到服务器里面的war包下 ...

用gulp把less文件编译成css文件

第一次使用gulp构建工具,使用gulp将.less文件编译成.css文件并输出.根据视频做了笔记.提供新手和自己以后做参考. HTML文件

Golang 编译成 DLL 文件

golang 编译 dll 过程中需要用到 gcc,所以先安装 MinGW. windows 64 位系统应下载 MinGW 的 64 位版本: https://sourceforge.net/pro ...

如何使用keil5将stm32的hal库编译成lib文件——F1版本

hal库中keil5中编译的速度是比较慢的,相同情况下,每次都要编译的时候,比标准库是要慢很多的,因此就hal库编译成lib文件是一种加快编译速度的方法,当然也有其自身的缺点.一.步骤1.使用cube ...

随机推荐

git命令查看远程分支

使用git remote -v命令可以查看本地设置好的所有远程仓库地址. ➜ learn-vue git:(master) git remote -v origin https://github.co ...

用例设计工具PICT — 输入组合覆盖

1 成对测试简介 成对测试(Pairwise Testing)又称结对测试.两两测试,是一种正交分析的测试技术.成对组合覆盖这一概念是Mandl于1985年在测试Aad编译程序时提出来的.是当不可能遍 ...

SQL Server 2012 创建数据库快照

不是所有的MSSQL数据库版本都支持数据库快照,只有Enterprise版本的才支持. 在其他版本上,以Business Intelligence Edition版本为例,创建快照时,会报如下错误 消 ...

Lock wait timeout exceeded; try restarting transaction

What gives this away is the word transaction. It is evident by the statement that the query was atte ...

Linux 内核动态函数调用可视化工具

要求: python .7以上 https://www.python.org/ftp/python/ EG:wget --no-check-certificate https://www.python ...

react 首屏加载优化

react 首屏加载优化,原本是在入口HTML文件中加载loading动画,但是部署在测试环境上的时候一直无法显示loading的部分,也是奇怪了,我们测试环境的部署一直跟本地的都不太一样,内外网的转 ...

Java 经典面试题 —— 性能

1. 性能 String.StringBuffer 与 StringBuilder 两个字符串相加,str1+str2,相当于执行: StringBuilder strBuilder1 = new S ...

求XF+闭包(第十一届河南省省赛真题)

题目描述 如何设计一个好的数据库不仅仅是一个理论研究问题,也是一个实际应用问题.在关系数据库中不满足规范化理论的数据库设计会存在冗余.插入异常.删除异常等现象. 设R(U)是一个关系模式,U={ A1 ...

关于Unity中混合模式、Alpha测试、深度测试、通道遮罩、面剔除的使用----渲染通道通用指令(二)

混合模式 着色完成后,需要把颜色混合到帧缓冲区里面,涉及到源和目标. 1:在所有计算完成后,决定当前的计算结果输出到帧缓冲区时,如何混合源和目标,通常用来绘制半透明的物体;2: Blend Off 关 ...

你可能感兴趣的:(python文件编译为so)