2013-03-05 59 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