본문 바로가기

프로그래밍/AI:ML:DL

2021년 5월 konlpy 설치시 문제점들

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 에러가 발생하는 것 같다.

 
728x90