Mac上把python源文件编译成so文件
2018-07-12 11:49
363 查看
把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
参考
相关文章推荐
- Mac COCOS2D-X用NDK编译安卓项目,打包成.so文件总结
- [iuud8]基于cocos2dx2.26在mac下编译通过的.so文件移植到win32位环境
- python文件编译成so介绍 - 2.使用makefile将py文件编译成so文件并制作成rpm包,实现自动化
- python文件编译成so介绍 - 1.使用cython将py文件编译成so文件
- C++编译问题-检测到 Mac 文件格式: 请将源文件转换为 DOS 格式或 UNIX 格式
- win/mac下反编译Android安装包-APK文件
- android studio 编译C生成.so文件
- Windows下编译使用Android NDK,调用SO文件
- python学习笔记--将python源文件打包成exe文件(pyinstaller)
- 明白python文件如何组织,理解建立源文件
- so文件在当前目录的编译方法
- extern、头文件、源文件与编译和链接
- linux 下eclipse编译release版本的so文件
- Linux下使用Nsight交叉编译so文件
- Mac下使用Eclipse编译C/C++文件出现 launch failed, binary not found 错误的解决办法
- Linux下查看.so和可执行文件是否debug编译
- Mac与Widow下编译与运行java文件引入多个外部jar包
- android studio 使用ndk编译.C文件生成so文件
- 检测到 Mac 文件格式: 请将源文件转换为 DOS 格式或 UNIX 格式
- C编译: 动态连接库 (.so文件)