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

时间:2013-03-05 02:31:51

标签: python interpreter cpython pypy netcdf

我对PyPy很绿,我使用PyPy1.9来解释我的Python代码。

如您所知,CPython解释器可以导入打包在.so文件中的模块,该文件是从C / C ++代码编译的。

但是PyPy1.9解释器告诉我他在.so文件中找不到该模块,我的代码有点慢,我想优化性能,帮助!!

2 个答案:

答案 0 :(得分: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。)

如果您还没有installed 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。)但最简单的方法就是尝试并看看。

答案 1 :(得分:-1)

对于PyPy,您需要使用CFFI之类的内容,使用Foreign Function Interface来访问库代码(有关详细信息,请参阅Loading Libraries部分)。

修改:我已经通过上述答案予以纠正了。我会在这里留下这个答案,但是有一个替代方法可以访问库并简单地接受合理的downvotes。