我对PyPy是绿色的,我使用PyPy1.9来解释我的Python代码。如何在PyPy中导入.so模块?
如您所知,CPython解释器可以导入打包在.so文件中的模块,该文件由C/C++代码编译。
但是PyPy1.9解释器告诉我他无法在.so文件中找到模块,我的代码有点慢,我想优化性能,帮助!
我对PyPy是绿色的,我使用PyPy1.9来解释我的Python代码。如何在PyPy中导入.so模块?
如您所知,CPython解释器可以导入打包在.so文件中的模块,该文件由C/C++代码编译。
但是PyPy1.9解释器告诉我他无法在.so文件中找到模块,我的代码有点慢,我想优化性能,帮助!
对于PyPy,您需要使用类似CFFI的东西,它使用Foreign Function Interface访问库代码(有关更多信息,请参阅关于Loading Libraries的部分)。
编辑:我站在上面的答案更正。我会在这里留下这个答案,虽然有一个替代访问库,只是接受合理的downvotes。
不正确。你可以做到这一点,你也可以使用'ctypes'(它可以与PyPy和CPython一起使用),但你也可以使用(大多数)CPython扩展模块。 – abarnert 2013-03-05 02:54:59
首先,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
,当然)
如果你还没有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)。但最简单的事情就是试试看。
如果您告诉我们您尝试了什么,您想要哪个模块的C版本,您使用的是哪个平台等,这将有所帮助。一般来说,尽管PyPy_can_使用CPython模块,但使用PyPy特定的“混合模式”模块,或ctypes或CFFI(即使ctypes通常在CPython中略有下降)可能会更快。还有一些模块还没有通过CPyExt工作(最着名的是'numpy'和一切依赖于它的模块)。 – abarnert 2013-03-05 03:03:15
@abarnert,我使用'从Scientific.IO.NetCDF导入NetCDFFile作为数据集'来读取NetCDF文件,我在ubuntu12.04下。 – xunzhang 2013-03-05 03:07:41
我搜索时出现的第一个网站是http://gfesuite.noaa.gov/developer/netCDFPythonInterface.html,它讨论了使用'Numeric'(这是'numpy'的一个老祖先),所以...我赢了不保证事情会为你解决。但值得尝试。 – abarnert 2013-03-05 03:11:11