【问题标题】:Compiling single SciPy module to *.pyd将单个 SciPy 模块编译为 *.pyd
【发布时间】:2015-04-17 10:01:26
【问题描述】:
我正在开发一个主要使用 NumPy 和一个 SciPy 模块 (scipy.optimize.fsolve) 的小工具。我与其他人分享它的想法是它与 Portable Python 打包在一起,这样理论上每个人都可以运行它。
整个 SciPy 包很重(大约 80 mb)。是否可以只将 1 个模块编译成 *.pyd 并将其作为任何其他模块导入,这样我就不必包含我实际上不需要的模块?
【问题讨论】:
标签:
python
module
scipy
portability
pyd
【解决方案1】:
如果您只想随代码分发一个子集 SciPy 代码(尤其是 scipy.optimize.fsolve),有多种可能性,
- 查看 SciPy 源代码并仅复制
fsolve 函数所需的文件。快速浏览一下,至少是scipy/optimize/optimize.py、scipy/optimize/minpack.py、scipy/optimize/_minpack.so/.pyd(但也许我错过了几个)。
- 在更简单的方法中,逐个文件夹删除 scipy 安装目录中未使用的部分(尤其是那些占用大量空间的部分),包括
scipy/weave、scipy/sparse、scipy/linalg 等。
- 围绕
scipy.optimize.fsolve 编写一个简单的包装器,并使用 cython 将其编译为 C 代码,这应该会生成一个独立的 .pyd/.so
应该有一个 python 模块来自动执行此操作,例如pyinstaller 确实只在它生成的二进制可执行文件中包含所需的模块。所以你需要一个等价的 pyinstaller 来生成动态库。