• python编译成so文件


    目的:编译python为so文件以达到保护代码加速等目的
    环境 windows
    这里我参考了很多文档编写,结果均无法生成 so 文件

    搜索关键字:

    1. python编译无法生成 .so 文件
    2. 生成了.pyd 文件
    3. pyd文件调用
    4. pyd文件和so文件的关系
    5. 报错 ImportError: dynamic module does not define module export function (PyInit_aaa)

    具体流程如下

    1、编写文件test.py

    def say():
        print('???say what !')
    
    • 1
    • 2

    2、编写文件transform.py

    from distutils.core import setup
    from Cython.Build import cythonize
    setup(
      ext_modules = cythonize("test.py",language_level=3) #注意这里推荐使用相对路径,编译出的so文件在引用其他模块时可能会出现路径问题
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、运行命令

    这里如果直接执行python3 transform.py 可能会报错
    在这里插入图片描述
    这里可以在执行的时候加上 --help-commands 查看有哪些命令
    在这里插入图片描述
    这里我们用 build_ext
    python3 transform.py build_ext --inplace

    (–inplace 是指在当前目录生成)
    这里执行完成会生成一个文件夹和两个文件
    在这里插入图片描述
    这里我查了半天,不是说好生成so文件调用的吗?怎么没有了。

    然而解释就是,so文件是linux下生成的,windows下生成的是pyd文件

    这里参考https://blog.csdn.net/ningyanggege/article/details/120763018
    1、pyx
    .pyx 文件是由 Cython 编程语言 “编写” 而成的 Python 扩展模块源代码文件;类似于 C 语言的 .c 源代码文件,.pyx 文件中有 Cython 模块的源代码

    2、pyd与so
    不像 Python 语言可直接解释使用的 .py 文件,.pyx 文件必须先被编译成 .c 文件,再编译成 .pyd (Windows 平台) 或 .so (Linux 平台) 文件,才可作为模块 import 导入使用。

    4、调用执行

    单独把pyd文件粘贴出来,防止和源py文件混着看不出效果。
    代码很简单

    import test
    test.say()
    
    • 1
    • 2

    然后就可以看到结果了

    注意事项:
    这里需要注意,生成的test.cp37-win_amd64.pyd 不可以任意更改名字。你可以把版本信息删掉,但是test应该是不能改的,我之前测试的时候就是改了名字然后报错

    ImportError: dynamic module does not define module export function (PyInit_aaa)
    
    • 1

    5、linux中生成so文件

    步骤同上,注意内容同上,只是生成的文件会变为 .so 文件。

  • 相关阅读:
    python实现彭曼公式计算潜在蒸散发ET0
    如何用cmd命令快速搭建FTP服务
    【Android】编译系统之 make 和 Soong
    基于springboot+vue+mysql的新能源充电系统--前后端分离(内含源码+报告+部署教程)
    Linux【搭建环境与基本指令】
    机房工程实习报告怎么写2500字
    优化redis key 迁移程序(云原生版本)
    Java8新特性: lambda 表达式介绍
    springboot + easyRules 搭建规则引擎服务
    会话技术!
  • 原文地址:https://blog.csdn.net/qq_43994782/article/details/127845454