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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!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