如何在PyPy中导入.so模块?

2 投票
2 回答
2699 浏览
提问于 2025-04-17 17:57

我刚接触PyPy,正在用PyPy1.9来运行我的Python代码。

你知道,CPython解释器可以导入打包成.so文件的模块,这些文件是从C/C++代码编译而来的。

但是PyPy1.9解释器告诉我,它找不到.so文件里的模块,我的代码运行得有点慢,我想提高性能,求助!!

2 个回答

-1

如果你想在PyPy中使用某些功能,你需要用到一种叫做 CFFI 的工具。这个工具利用了一种叫做 外部函数接口 的技术,来访问库中的代码。想了解更多,可以查看 加载库 这一部分。

编辑: 我承认上面的回答更准确。不过我还是把这个回答留在这里,作为访问库的另一种选择,虽然可能会因此受到一些合理的反对票。

2

首先,CPyExt 这个东西在 PyPy 里已经有一段时间了,我记不清具体版本,但在 1.9 之前就有了。

简单来说,你只需要像在 CPython 中那样构建并安装这个模块就可以了。

要注意的是,安装的时候一定要用 PyPy,而不是 CPython。因为你电脑上每个 Python 的安装都有自己独立的 site-packages 目录,CPyExt 需要的模块是要用 PyPy 的头文件和库来构建,而不是 CPython 的。

如果你是手动安装,只需要用 pypy setup.py install 来代替 python setup.py install。如果你使用 pipeasy_install,那么 PyPy 版本的这些工具通常会叫 pip_pypyeasy_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 时搞得很复杂)。不过最简单的办法就是试试看。

撰写回答