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
参考
- http://www.fidding.me/article/20
- http://www.cnblogs.com/vamei/archive/2013/04/04/2998850.html
- https://blog.csdn.net/linshenyuan1213/article/details/72677246
Mac上把python源文件编译成so文件的更多相关文章
- 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文件 <!DOCTYPE html> <htm ...
- 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 ...
随机推荐
- java.lang.NullPointerException 空指针异常问题
java.lang.NullPointerException 空指针异常问题: 空指针异常抛出的异常信息一般是: Exception in thread "main" java.l ...
- 【总结 】550,535,553 Mail from must equal authorized user— jenkins(hudson) email163邮箱和26邮箱成功配置总结
Failed to send out e-mail com.sun.mail.smtp.SMTPSendFailedException: 553 Mail from must equal author ...
- 树莓派进阶之路 (020) - 基于24位AD转换模块HX711的重量称量实验
参考文档:http://www.geek-workshop.com/thread-2315-1-1.html 参考文档:https://wenku.baidu.com/view/e5d5e4e2652 ...
- 颜色传感器TCS230及颜色识别电路(转)
摘要 TCS230是美国TAOS公司生产的一种可编程彩色光到频率的传感器.该传感器具有分辨率高.可编程的颜色选择与输出定标.单电源供电等特点:输出为数字量,可直接与微处理器连接.文中主要介绍TCS23 ...
- POJ 2230 Watchcow (欧拉回路)
Watchcow Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 5258 Accepted: 2206 Specia ...
- 手动修改magento域名
So it turns out the problem was that Apache didn't have write permissions to the WEBROOT/var directo ...
- 【SqlServer】SqlServer存储过程使用
我们一开始学习数据库语言的时候就是用一些简单的insert,select等语法,但是随着我们学习数据库的深入,就会发现一些简单的语法满足不了我们的要求,比如处理一些业务逻辑,多表关联的时候,还有就是虽 ...
- [.NET] 使用VALIDATIONCONTEXT快速进行模型资料的验证 》简单xml创建-json转xml
[.NET] 使用VALIDATIONCONTEXT快速进行模型资料的验证 在进行WebAPI功能开发的时候,一般传统的验证资料是否合法的方式,都是透过if/else的方式进行判断若是使用Valida ...
- mysql用户权限管理的问题
为了保证数据库安全,建立了若干个只能select的用户,但在权限授权的时候出现了不能连接的问题, 一个个尝试了一下,需要将 : 管理 -> SUPER项勾选才行(使用phpmyadmin),上 ...
- Python 文件 close() 方法
描述 Python 文件 close() 方法用于关闭一个已打开的文件.关闭后的文件不能再进行读写操作, 否则会触发 ValueError 错误. close() 方法允许调用多次. 当 file 对 ...