2011-08-05 83 views
2

當我嘗試使用Jython調用文件及其方法時,它顯示以下錯誤,而我的Numpy,Python和NLTK已正確安裝,並且如果直接從Python直接運行外殼Jython:ImportError:No module named multiarray

File "C:\Python26\Lib\site-packages\numpy\core\__init__.py", line 5, in <module> 
import multiarray 
ImportError: No module named multiarray 

,我使用的代碼是簡單的:

PyInstance hello = ie.createClass("PreProcessing", "None"); 
PyString str = new PyString("my name is abcd"); 
PyObject po = hello.invoke("preprocess", str); 
System.out.println(po); 

當我運行包含PreProcessing類,並調用它正常工作方法預處理蟒只有文件,但使用Jython它拋出錯誤。

Jython無法導入所有僅保留在文件夾中的編譯版本的庫而不是類代碼本身。它不是multiarray.py它只有multiarray.pyd這是編譯的版本,所以它不會在Jython中檢測到。

它爲什麼顯示這種行爲?如何解決它?

請幫忙!

+0

我回答了你的問題嗎?如果是這樣,請將其標記爲。謝謝! –

回答

1

jython是Java。 Numpy的一部分被實現爲Python的擴展(.pyd文件)。有些部分是以.py文件的形式實現的,這些文件在Jython中工作得很好。但是,它們無法在無法訪問C級代碼的情況下運行。目前,在jython中有使用numpy的方法。請參閱:

Using NumPy and Cpython with Jython 或者 Is there a good NumPy clone for Jython?

有關的替代品最近的討論。

+0

但我面臨的問題有點不同。 Numpy除了一個已經編譯好的文件外,其他所有的東西都在工作。這就是說,如果該文件只是它的工作代碼,而不是編譯的類 – ninja123

+0

這是正確的。編譯後的類從C代碼編譯。帶有源代碼的類應該工作得很好,但它們不會獨立工作。我仍然在Jython中尋找一個好的替代品。讓我知道如果你找到一個! –

+0

我編輯了我的答案,以澄清只有部分numpy編譯。純Python組件將在Jython中工作。編譯的部分不會。 –

2

我知道這是一個古老的線程,但我最近遇到了同樣的問題,並能夠解決它,我認爲解決方案應該在這裏以防萬一將來遇到它。就像上面說的那樣,Jython不能處理numpy的預編譯的c文件,但在nltk中,numpy的使用非常有限,並且重寫受影響的代碼段非常簡單。這就是我所做的,我確信它不是最具計算效率的解決方案,但它的工作原理。這個代碼可以在nltk.metrics.Segmentation中找到,我只會粘貼相關的代碼,但它仍然會有一點點。

在GHD結束
def _init_mat(nrows, ncols, ins_cost, del_cost): 
    mat = [[4.97232652e-299 for x in xrange(ncols)] for x in xrange(nrows)] 
    for x in range(0,ncols):  
     mat[0][x] = x * ins_cost 
    for x in range(0, nrows): 
     mat[x][0] = x * del_cost 
    return mat 

def _ghd_aux(mat, rowv, colv, ins_cost, del_cost, shift_cost_coeff): 
    for i, rowi in enumerate(rowv): 
     for j, colj in enumerate(colv):   
      shift_cost = shift_cost_coeff * abs(rowi - colj) + mat[i][j] 
      if rowi == colj: 
       # boundaries are at the same location, no transformation required 
       tcost = mat[i][j] 
      elif rowi > colj: 
       # boundary match through a deletion 
       tcost = del_cost + mat[i][j + 1] 
      else: 
       # boundary match through an insertion 
       tcost = ins_cost + mat[i + 1][j] 
      mat[i + 1][j + 1] = min(tcost, shift_cost) 

此外,return語句改爲

return mat[-1][-1] 

我希望這可以幫助別人!我不知道是否有其他地方存在這個問題,但這是我唯一遇到的問題。如果還有其他類似的問題,他們可以用同樣的方式解決(使用列表而不是numpy數組),同樣,你可能會失去一些效率,但它可以工作。