如何在PyPy中导入.so模块?
我刚接触PyPy,正在用PyPy1.9来运行我的Python代码。
你知道,CPython解释器可以导入打包成.so文件的模块,这些文件是从C/C++代码编译而来的。
但是PyPy1.9解释器告诉我,它找不到.so文件里的模块,我的代码运行得有点慢,我想提高性能,求助!!
2 个回答
首先,CPyExt 这个东西在 PyPy 里已经有一段时间了,我记不清具体版本,但在 1.9 之前就有了。
简单来说,你只需要像在 CPython 中那样构建并安装这个模块就可以了。
要注意的是,安装的时候一定要用 PyPy,而不是 CPython。因为你电脑上每个 Python 的安装都有自己独立的 site-packages
目录,CPyExt 需要的模块是要用 PyPy 的头文件和库来构建,而不是 CPython 的。
如果你是手动安装,只需要用 pypy setup.py install
来代替 python setup.py install
。如果你使用 pip
或 easy_install
,那么 PyPy 版本的这些工具通常会叫 pip_pypy
和 easy_install_pypy
。
所以,如果你已经安装了 pip
,操作应该很简单:
pip_pypy install foo
(当然,可能需要加个 sudo
。)
如果你还没有安装 pip
,那就像在 CPython 中安装一样为 PyPy 安装它。例如:
curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py
pypy get-pip.py
如果你使用的是二进制安装包,那你显然需要下载适用于 PyPy-1.9 的二进制安装包。如果没有这样的包,你就不能使用二进制安装包。(就像你想在 32 位 Windows 上为 CPython 2.7 安装 foo
,但只有 2.6 或 64 位的包可用。)
最后一点要注意:有些包目前还不支持 CPyExt。最明显的就是 numpy
以及所有依赖于它的东西,还有一些需要绑定 Fortran 代码的包。这些包中的一些会检查是否是 CPython(或者检查是否不是 PyPy?)并提前报错。还有一些可能会尝试构建但失败。还有一些可能成功构建,但在某些情况下不工作(例如,有些在任何线程数超过 1 的程序中都会失败,因为它们在处理 GIL 时搞得很复杂)。不过最简单的办法就是试试看。