win10 配置pylucene


參考文章

http://lxsay.com/archives/269

Windows 10 64 Bit 編譯安裝 PyLucene 6.2, 6.4 或 6.5

update 2017.07: 添加了對 Python 3 的支持

這可能是互聯網上第一篇詳細介紹 Windows 下安裝新版本 Pylucene 的文章。PyLucene 4 以下原本都有提供 windows 下的安裝包,但是新版本沒有了。

網上那些說 Pylucene 在 Windows 系統上只能裝 32 位版本的文章,純屬以訛傳訛。

本文允許帶修改的轉載,但轉載時請注明原文出處: lxsay.com

本文也適用於 32 位的 Windows 系統,只要把安裝的軟件都改成 32 位的版本就可以了

 

前提條件:

  1. 安裝 python ( 本文以 Python 2.7.13 為例,Python 3 也可以 ) 環境(推薦 Anaconda,自帶 gensim, numpy, scipy 等在 Windows 下比較難安裝的庫).
  2. 安裝 JDK 1.8 ( 64 位版本) 並配置環境變量 (推薦按照這篇文章操作:http://www.cnblogs.com/shinge/p/5500002.html),並且配置JRE的環境變量(將 JAVA_HOME/jre/bin/server 這個路徑也加進 path 環境變量)
  3.  安裝 VC for Python 2.7 ( www.microsoft.com/en-hk/download/details.aspx?id=44266 )。如果是 Python 3,安裝 Visual C++ 2015 Build Tools (http://landinghub.visualstudio.com/visual-cpp-build-tools)

 

步驟1.   安裝 Apache Ant 並配置環境變量(在 path 環境變量中添加 Ant 安裝主目錄下的 bin 目錄路徑,和后面配置的 ant 可執行文件路徑不一樣)

步驟2.  安裝 cygwin 64 bit (用於在 windows 系統中執行 linux 的命令),安裝時在選擇 packages 的窗口將 “Devel” 項由 “Default” 改為 “Installed”。 並且配置 cygwin 64 的環境變量(在 path 環境變量中添加 cygwin 64 安裝主目錄下的 bin 目錄路徑),重啟電腦使之生效

 

步驟3.  下載並解壓 pylucene 的 源代碼 (一般解壓出來的文件夾叫作 pylucene-6.4.1 之類)

步驟4.   進入 pylucene 安裝文件夾下的 JCC 文件夾,修改 setup.py文件, 在 CFLAGS 配置這里,在 'win32' 后面添加 "/bigobj" 這個參數,如下面所示

CFLAGS = {
'darwin': ['-fno-strict-aliasing', '-Wno-write-strings',
'-mmacosx-version-min=10.5'],
'ipod': ['-Wno-write-strings'],
'linux2': ['-fno-strict-aliasing', '-Wno-write-strings'],
'sunos5': ['-features=iddollar',
'-erroff=badargtypel2w,wbadinitl,wvarhidemem'],
'win32': ["/EHsc", "/D_CRT_SECURE_NO_WARNINGS","/bigobj"], # MSVC 9 (2008)
'mingw32': ['-fno-strict-aliasing', '-Wno-write-strings'],
'freebsd7': ['-fno-strict-aliasing', '-Wno-write-strings'],
}

如果不添加 "/bigobj" 參數, 在編譯 pylucene 時會提示文件過大,編譯器無法編譯

update: 在 pylucene 6.5 中,這個問題已經被解決,不需要添加此參數

 

步驟5.   在命令行下進入 jcc 文件夾,輸入 python setup.py build ,如果沒有錯誤信息,繼續輸入 python setup.py install 安裝 JCC 。重啟電腦

步驟6.    進入 pylucene-6.2.0 文件夾(根據要安裝的版本而定,比如 pylucene-6.4.1 之類),修改 Makefile文件

首先注釋掉(通過在每行前面添加'#'符號) 這一段默認配置

# Mac OS X 10.12 (64-bit Python 2.7, Java 1.8)
PREFIX_PYTHON=/Users/vajda/apache/pylucene/_install
ANT=/Users/vajda/tmp/apache-ant-1.9.3/bin/ant
PYTHON=$(PREFIX_PYTHON)/bin/python
JCC=$(PYTHON) -m jcc.__main__ --shared --arch x86_64
NUM_FILES=8

然后插入

PREFIX_PYTHON=D:/Progra~2/Anaconda2
ANT=D:/apache-ant-1.9.7/bin/ant
JAVA_HOME=C:/Progra~1/Java/jdk1.8.0_101
PYTHON=$(PREFIX_PYTHON)/python.exe
#JCC=$(PYTHON) -m jcc --shared --find-jvm-dll
JCC=$(PYTHON) -m jcc
NUM_FILES=8

update: 在 pylucene 6.5 中 JCC 項不再接受 shared 參數,因此應該改為 JCC=$(PYTHON) -m jcc, 否則安裝時會出錯

其中 PREFIX_PYTHON 是 python 的安裝主目錄,如果你創建了一個新的 Anaconda 環境並在該環境下編譯,請將 PREFIX_PYTHON 換成該環境的根目錄 (一般是 Anaconda2/envs/環境名)

ANT 是 ant 的二進制可執行文件的路徑(注意不是安裝目錄而是可執行文件路徑)

NUM_FILES 參數用於指定中間文件的分割數, 使得編譯器可以處理大的文件,但是如果修改為其他數值可能會引起錯誤。 因此最好的辦法還是在前一步指定 vc的參數 "/bigobj"

另外需要注意的是,Makefile 不接受帶有空格的路徑,因此如果路徑帶有空格的話請用命令行使用的縮寫路徑(又叫做 dos path, 比如上面這段就采用了這種寫法)

步驟7.   運行 make 進行編譯(注意:如果之前沒有安裝並配置 cygwin64 的話,這一步會無法進行下去)

步驟8.   編譯完成后運行 make test 進行測試,由於項目的一些 bug,有幾個檢測 PyLucene 異常拋出的測試不會通過,但並無大礙。

步驟9.   運行 make install 進行安裝

 

常見問題:

1. 編譯安裝 JCC 時無法使用 MSVC 編譯,python 總是自動用 gcc 進行編譯:要改成用 visual studio c++ 編譯的話,需要編輯 python安裝主目錄\Lib\distutils下的distutils.cfg文件,將文件內容修改為下面所示

[build]
compiler=msvc

[build_ext]
compiler=msvc

其實本質上就是修改 setuptools 的配置文件

第二種辦法是運行 setup.py 文件安裝時添加參數變為  python setup.py build --compiler=msvc   但是此方法在接下來編譯安裝 pylucene 時會失效,因為 make 無法指定 python 使用的 C/C++ 編譯器

2. make test 給出 error 123:     linux 下出錯的原因在於 Lucene 的測試代碼使用了舊版 python 的異常。將 test_Pylucene.py 中的 WindowsError 改為 OSError 就可以。  Windows 下出錯的原因也是如此,但是涉及的文件比較多,改起來比較麻煩,所以直接忽略

3.  make 時提示 from jcc import _jcc 找不到 dll:原因是找不到 jvm.dll,將包含 jvm.dll 的 JRE 目錄路徑加入 path 環境變量即可(如JRE\bin\server)。如果在編譯安裝 JCC 這一步之前沒有設定好 JDK 的系統變量,也會出現這類錯誤。 建議設定環境變量后重啟電腦一次。如果設定環境變量后仍出現這樣的錯誤,可以修改 JCC 目錄下的 setup.py 文件,將 'JAVAHOME' 修改為 JDK 的實際目錄路徑

4. 用 pylucene 6.2 和 6.4 建立的索引可以互相兼容 , 但 pylucene 4 建立的索引不能在 6.2 以上版本使用(需要使用 IndexUpdater 包處理)。程序代碼也是,因為很多函數和定義在新版本中被移除了

遇到的問題有

在C:\Python27\Lib\site-packages\JCC-3.0-py2.7-win-amd64.egg\jcc\windows.py中

的add_jvm_dll_directory_to_path

找不到 jvm.dll

解決方法 :

將dll_path寫死進去,

def add_jvm_dll_directory_to_path():

path = os.environ['Path'].split(os.pathsep)
dll_path = get_jvm_dll_directory()
dll_path='D:\programs\java\jdk1.8.0\jre\bin\server\jvm.dll'
if dll_path is not None:
path.append(dll_path)
os.environ['Path'] = os.pathsep.join(path)
return True

raise ValueError, "jvm.dll could not be found"

如上

遇到的另一個問題是

java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: WARNING: Can not find lexical dictionary directory! This will cause unpredictable exceptions in your application! Please refer to the manual to download the dictionaries.
at org.apache.lucene.analysis.cn.smart.AnalyzerProfile.init(AnalyzerProfile.java:73)

解決方法參考:

http://blog.csdn.net/dsbatigol/article/details/14448151

原因是,在添加smartcn那個分詞器時,相應配置沒弄好

在Pylucene根目錄下進入makefile,

  1. 找到這么一行

    #JARS+=$(SMARTCN_JAR)            # smart chinese analyzer
    

    刪掉這個#

  2. 找到

    --exclude org.apache.lucene.sandbox.queries.regex.JakartaRegexpCapabilities \
    

    在附近加入一句:

    --exclude org.apache.lucene.analysis.cn.smart.AnalyzerProfile\
    

重新make和make install覆蓋安裝,搞定!

總結就是,碰到問題,要從錯誤分析,

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM