cython生成dll踩坑记(三)—变量共享篇
2023-10-15
前两期谈了谈cython的编译生成dll与打包的踩坑,现在来谈谈多线程。
- 坑点一, cython里extern并不能共享变量
先看下面一行代码
// py_import.h |
|
// Dllmain.cpp |
简单来说,就是test.pyx和Dllmain.cpp都调用了py_import.h里的print_test(),输出a的数值和a的地址。
假如两个文件是cpp,他们的结果是一样的,但假如一个文件是cython,另一个是cpp呢?
来测试一下吧
// 用这个文件生成exe来进行测试 |
// 输出结果 |
根据结果,我们发现,cpp中的a地址和pyx中的a地址是不一样了,换句话说,pyx对py_import.h里的变量做了深拷贝
所以,cython里extern并没有与cpp共享变量
- 要共享变量,请使用public,在cython里声明
现在,我们稍微改动一下代码,
// py_import.h |
|
// Dllmain.cpp |
就改动这三个地方。
简单来说,原来是在py_import.h里声明,变成了在test.pyx里声明。
重新编译运行,看看结果
from py |
- 坑点二,当放在pyx声明时,必须先初始化py解释后再调用该变量,否则变量处于未初始化状态。
这次两个地方的地址就是一样了
因此,我们就知道,声明放在cython里,才能和cython共享变量
cython三期的踩坑记就这样完成了。
本来想说说多线程的,但可惜我能知道的东西也不多。