2013-03-05 156 views
2

我对PyPy是绿色的,我使用PyPy1.9来解释我的Python代码。如何在PyPy中导入.so模块?

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

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

+0

如果您告诉我们您尝试了什么,您想要哪个模块的C版本,您使用的是哪个平台等,这将有所帮助。一般来说,尽管PyPy_can_使用CPython模块,但使用PyPy特定的“混合模式”模块,或ctypes或CFFI(即使ctypes通常在CPython中略有下降)可能会更快。还有一些模块还没有通过CPyExt工作(最着名的是'numpy'和一切依赖于它的模块)。 – abarnert 2013-03-05 03:03:15

+0

@abarnert,我使用'从Scientific.IO.NetCDF导入NetCDFFile作为数据集'来读取NetCDF文件,我在ubuntu12.04下。 – xunzhang 2013-03-05 03:07:41

+0

我搜索时出现的第一个网站是http://gfesuite.noaa.gov/developer/netCDFPythonInterface.html,它讨论了使用'Numeric'(这是'numpy'的一个老祖先),所以...我赢了不保证事情会为你解决。但值得尝试。 – abarnert 2013-03-05 03:11:11

回答

-1

对于PyPy,您需要使用类似CFFI的东西,它使用Foreign Function Interface访问库代码(有关更多信息,请参阅关于Loading Libraries的部分)。

编辑:我站在上面的答案更正。我会在这里留下这个答案,虽然有一个替代访问库,只是接受合理的downvotes。

+1

不正确。你可以做到这一点,你也可以使用'ctypes'(它可以与PyPy和CPython一起使用),但你也可以使用(大多数)CPython扩展模块。 – abarnert 2013-03-05 02:54:59

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,安装对于PyPy来说,就像对于CPython一样。例如:

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)。但最简单的事情就是试试看。

+0

我使用二进制包。 – xunzhang 2013-03-05 03:02:29

+1

@xunzhang:那么你必须得到PyPy的二进制包。而且,如果没有,你不能使用二进制包;你必须从源代码安装。 – abarnert 2013-03-05 03:03:59