python文件编译为so和可执行文件

1 准备setup.py文件

复制代码
#!/usr/bin/env python
# encoding = utf-8
from distutils.core import setup, Extension
from Cython.Build import cythonize
import os, os.path as osp
import glob

"""
python3.7 -m pip install pycrypto
python3.7 -m pip install Cython # 编译其他模块为so python3.7 setup.py # 编译入口启动脚本为 可执行文件 cython main.py --embed && \ gcc -c main.c -I/usr/include/python3.7m -o main.o && \ gcc main.o -L/usr/lib/python3.7/config-3.7m-aarch64-linux-gnu -lpython3.7m -o main rm -r ./*.c && rm -r ./*.o
""" build_dir = "build_so" build_tmp_dir = build_dir + "/temp" skip_files = [ 'main.py' ] def compile_to_so(pyfile): # compile so setup( name='export_so', version='1.0 build 20220818.2212', # single file ext_modules=cythonize(pyfile, nthreads=2), script_args=["build_ext", "-b", build_dir, "-t", build_tmp_dir] ) # remove tmp files for f in glob.glob(f'./**/*.c', recursive=True): os.remove(f) def compile_all_files(): os.makedirs(f'./{build_dir}', exist_ok=True) os.makedirs(f'./{build_tmp_dir}', exist_ok=True) for f in glob.glob(f'./**/*.py', recursive=True): fname = osp.basename(f) if '__init__' in fname or 'setup' in fname: continue elif fname in skip_files: continue try: compile_to_so(f) except Exception as e: print(e) os.removedirs(build_tmp_dir) print('done.') if __name__ == '__main__': compile_all_files() # compile_to_so('./xx/xx.py')
复制代码

2  先执行setup.py 生成so文件, 生成的目录结构和原来一样

3 再执行sh命令,把入口py编译为 二进制文件

复制代码
cython main.py --embed && \
gcc -c main.c -I/usr/include/python3.7m -o main.o && \
gcc main.o -L/usr/lib/python3.7/config-3.7m-aarch64-linux-gnu -lpython3.7m  -o main
rm -r ./*.c && rm -r ./*.o

#如果gcc编译失败,则使用py_compile来编译成 .pyc文件
#如果cython编译二进制执行文件失败,则使用py_compile生成.pyc  
输出位置在: ./__pycache__/xx.cpython-37.pyc
python -m py_compile xx.py
cp __pycache__/xx.cpython-37.pyc ./

启动程序:
python3.7 xx.cpython-37.pyc
复制代码

 

posted @   dangxusheng  阅读(942)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2018-11-09 mysql-8.0.13在windows上的部署
2018-11-09 爬虫 - 动态分页抓取 游民星空 的资讯 - bs4
2018-11-09 爬虫下载QQ音乐:获取所有歌手-每个歌手的专辑-每个专辑里的歌曲
2018-11-09 爬虫下载校花网美女信息-lxml
点击右上角即可分享
微信分享提示