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 !')

2、编写文件transform.py

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

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()

然后就可以看到结果了

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

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

5、linux中生成so文件

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值