konlpy 를 오랜만에 설치하고 테스트해 보았다. 설치시에 문제점들이 발견되어 정리하여 공유한다. 테스트는 윈도우에서 수행하였고, openjdk 가 (adoptopenjdk를 이용) 깔려 있으며, JAVA_HOME 과 PATH 설정도 되어 있는 상태이다.
1. python 3.7
새롭게 3.7 가상환경을 만들었다.
py -3.7 -m venv v3764
해당 가상환경에 들어가서 konlpy 를 설치했다.
c:\PYENVS> v3764\Scripts\activate
(v3764) c:\PYENVS> pip install konlpy
python 인터프리터로 들어가 konlpy 헬로월드를 해 보자. 에러가 발생한다.
(v3764) C:\PYENVS>python
Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from konlpy.tag import Kkma
>>> k = Kkma()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\PYENVS\v3764\lib\site-packages\konlpy\tag\_kkma.py", line 95, in __init__
jvm.init_jvm(jvmpath, max_heap_size)
File "C:\PYENVS\v3764\lib\site-packages\konlpy\jvm.py", line 67, in init_jvm
convertStrings=True)
File "C:\PYENVS\v3764\lib\site-packages\jpype\_core.py", line 222, in startJVM
ignoreUnrecognized, convertStrings, interrupt)
SystemError: java.nio.file.InvalidPathException: Illegal char <*> at index 46: C:\PYENVS\v3764\lib\site-packages\konlpy\java\*
콜스택을 보니 jpype1 패키지 안에서 발생한다. 인터프리터를 나와서, jpype1 의 버전을 확인하고, jpype1 의 버전은 1.x 이하로 다운그레이드한다. (jpype1 이 1.x 로 major 버전에 바뀐 것이 오래되지 않았다.)
(v3764) C:\PYENVS>pip install "jpype1<1"
Collecting jpype1<1
Using cached JPype1-0.7.5-cp37-cp37m-win_amd64.whl (1.4 MB)
Installing collected packages: jpype1
Attempting uninstall: jpype1
Found existing installation: JPype1 1.2.1
Uninstalling JPype1-1.2.1:
Successfully uninstalled JPype1-1.2.1
Successfully installed jpype1-0.7.5
다시 인터프리터로 들어가 konlpy 기본 코드를 실행해 보자.
(v3764) C:\PYENVS>python
Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from konlpy.tag import Kkma
>>> k = Kkma()
>>> k.pos("안녕하세요. 세상!")
[('안녕', 'NNG'), ('하', 'XSV'), ('세요', 'EFN'), ('.', 'SF'), ('세상', 'NNG'), ('!', 'SF')]
>>>
성공!
2. python 3.8
위와 동일하게 가상환경을 만들고, 첫번째 에러를 확인하고, jpype1 의 다운그레이드하였다. 성공을 기대하고 실행해 본다.
설치패키지 확인
(v3864) c:\PYENVS> pip list
Package Version
----------------------------- ------------
JPype1 0.7.5
konlpy 0.5.2
인터프리터에서 import 시에 벌써 에러가 발생
(v3864) C:\PYENVS>python
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from konlpy.tag import Kkma
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\PYENVS\v3864\lib\site-packages\konlpy\__init__.py", line 11, in <module>
from konlpy.jvm import init_jvm
File "C:\PYENVS\v3864\lib\site-packages\konlpy\jvm.py", line 8, in <module>
import jpype
File "C:\PYENVS\v3864\lib\site-packages\jpype\__init__.py", line 20, in <module>
from ._core import *
File "C:\PYENVS\v3864\lib\site-packages\jpype\_core.py", line 20, in <module>
from . import types as _jtypes
File "C:\PYENVS\v3864\lib\site-packages\jpype\types.py", line 38, in <module>
from ._jarray import *
File "C:\PYENVS\v3864\lib\site-packages\jpype\_jarray.py", line 213, in <module>
_jcustomizer._applyCustomizerPost(_jpype._JArray, _JArrayProto)
File "C:\PYENVS\v3864\lib\site-packages\jpype\_jcustomizer.py", line 166, in _applyCustomizerPost
_applyCustomizerImpl(cls.__dict__, proto, sticky,
File "C:\PYENVS\v3864\lib\site-packages\jpype\_jcustomizer.py", line 148, in _applyCustomizerImpl
setter(p, v)
File "C:\PYENVS\v3864\lib\site-packages\jpype\_jcustomizer.py", line 167, in <lambda>
lambda p, v: type.__setattr__(cls, p, v))
TypeError: can't apply this __setattr__ to _jpype._JClass object
jpype 만 import 해보자.
>>> import jpype
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\PYENVS\v3864\lib\site-packages\jpype\__init__.py", line 20, in <module>
from ._core import *
File "C:\PYENVS\v3864\lib\site-packages\jpype\_core.py", line 20, in <module>
from . import types as _jtypes
File "C:\PYENVS\v3864\lib\site-packages\jpype\types.py", line 38, in <module>
from ._jarray import *
File "C:\PYENVS\v3864\lib\site-packages\jpype\_jarray.py", line 213, in <module>
_jcustomizer._applyCustomizerPost(_jpype._JArray, _JArrayProto)
File "C:\PYENVS\v3864\lib\site-packages\jpype\_jcustomizer.py", line 166, in _applyCustomizerPost
_applyCustomizerImpl(cls.__dict__, proto, sticky,
File "C:\PYENVS\v3864\lib\site-packages\jpype\_jcustomizer.py", line 148, in _applyCustomizerImpl
setter(p, v)
File "C:\PYENVS\v3864\lib\site-packages\jpype\_jcustomizer.py", line 167, in <lambda>
lambda p, v: type.__setattr__(cls, p, v))
TypeError: can't apply this __setattr__ to _jpype._JClass object
에러메시지로 검색을 해 보면, 파이썬 3.8.5 부터 jpype1 0.7.5 버전에서 (konlpy와는 상관없이) 해당 에러가 발생하는 것을 알 수 있다. ( stackoverflow.com/a/64261693/100093 )
jpype1 을 1.0.2 로 올려보면 어떨까?
(v3864) C:\PYENVS>pip install -U "jpype1<1.1"
Requirement already satisfied: jpype1<1.1 in c:\pyenvs\v3864\lib\site-packages (0.7.5)
Collecting jpype1<1.1
Downloading JPype1-1.0.2-cp38-cp38-win_amd64.whl (1.6 MB)
|████████████████████████████████| 1.6 MB 1.7 MB/s
Installing collected packages: jpype1
Attempting uninstall: jpype1
Found existing installation: JPype1 0.7.5
Uninstalling JPype1-0.7.5:
Successfully uninstalled JPype1-0.7.5
Successfully installed jpype1-1.0.2
(v3864) C:\PYENVS>python
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from konlpy.tag import Kkma
>>> k = Kkma()
>>> k.pos("안녕하세요.")
[('안녕', 'NNG'), ('하', 'XSV'), ('세요', 'EFN'), ('.', 'SF')]
>>>
놀랍게도, 에러없이 실행이 됐다.
계속 확인해 보니, jpype1-1.1.2, jpype1-1.2.0 에서도 문제없이 실행이 되는 것이 확인됐다. 결국 jpype1-1.2.1 에서만 java.nio.file.InvalidPathException 에러가 발생하는 것 같다.
'프로그래밍 > AI:ML:DL' 카테고리의 다른 글
음성 데이터 관련 모음 (0) | 2021.11.22 |
---|---|
Autoencoder 가 잘 학습되었는지를 확인하려면 (0) | 2021.01.15 |
GPU 사용 모니터 nvidia-smi-gui (0) | 2020.05.15 |
[YOLO] shape_optimizer failed: Invalid argument, remapper failed: Invalid argument, layout failed: Invalid argument (2) | 2020.04.01 |
tensorflow 2.1 : Could not load dynamic library 'libnvinfer.so.6' (0) | 2020.03.18 |