SQLAlchemy로 Oracle에 연결 한 후 scikit-learn을 import하려고하면 오류가 발생합니다.

현상



다음과 같이 SQLAlchemy Engine 인스턴스에서 실제로 DB를 연결 한 후 sklearn를 가져 오면 ImportError가 발생합니다.

demo.py/ImportError가 되는 경우
import sqlalchemy
import cx_Oracle

dsnStr = cx_Oracle.makedsn('localhost','1521','pdb-name')
connect_str = 'oracle://user:pass@' + dsnStr.replace('SID', 'SERVICE_NAME')
engine = sqlalchemy.create_engine(connect_str, max_identifier_length=128)

conn = engine.connect()

import sklearn # <-ここで「ImportError: DLL load failed」発生

스택 추적 전문
Traceback (most recent call last):
  File "demo.py", line 12, in <module>
    import sklearn
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\sklearn\__init__.py", line 80, in <module>    
    from .base import clone
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\sklearn\base.py", line 21, in <module>
    from .utils import _IS_32BIT
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\sklearn\utils\__init__.py", line 23, in <module>
    from .class_weight import compute_class_weight, compute_sample_weight
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\sklearn\utils\class_weight.py", line 7, in <module>
    from .validation import _deprecate_positional_args
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\sklearn\utils\validation.py", line 25, in <module>
    from .fixes import _object_dtype_isnan, parse_version
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\sklearn\utils\fixes.py", line 18, in <module> 
    import scipy.stats
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\scipy\stats\__init__.py", line 388, in <module>
    from .stats import *
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\scipy\stats\stats.py", line 180, in <module>  
    from . import distributions
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\scipy\stats\distributions.py", line 8, in <module>
    from ._distn_infrastructure import (entropy, rv_discrete, rv_continuous,
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\scipy\stats\_distn_infrastructure.py", line 23, in <module>
    from scipy import optimize
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\scipy\optimize\__init__.py", line 387, in <module>
    from .optimize import *
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\scipy\optimize\optimize.py", line 36, in <module>
    from ._numdiff import approx_derivative
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\scipy\optimize\_numdiff.py", line 6, in <module>
    from scipy.sparse.linalg import LinearOperator
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\scipy\sparse\linalg\__init__.py", line 114, in <module>
    from .eigen import *
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\scipy\sparse\linalg\eigen\__init__.py", line 9, in <module>
    from .arpack import *
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\scipy\sparse\linalg\eigen\arpack\__init__.py", line 20, in <module>
    from .arpack import *
  File "C:\Users\kurukuruz\anaconda3\envs\sqla-demo\lib\site-packages\scipy\sparse\linalg\eigen\arpack\arpack.py", line 43, in <module>
    from . import _arpack
ImportError: DLL load failed while importing _arpack: 指定されたプロシージャが見つかりません。


실제로 만나는 사례


.py 파일 내에서 위와 같이 처리 도중에 import를 기술하는 것은 없다고 생각하지만, 아래와 같은 경우에서는 에러가 발생할 수 있다.
  • Jupyter Notebook에서 어느 정도 작업 한 후 추가로 가져올 때
  • joblib.load(...) 등으로 오브젝트를 디시리얼라이즈 하는 경우 자신이 만난 것은 이것

    대책



    대증요법으로서는 코드내에서 미리 선언해 두면 된다.

    미리 import하는 예
    import sqlalchemy
    import cx_Oracle
    import joblib
    import sklearn # <- このファイル内では明には使用しないが宣言しておく
    
    dsnStr = cx_Oracle.makedsn('localhost','1521','pdb-name')
    connect_str = 'oracle://user:pass@' + dsnStr.replace('SID', 'SERVICE_NAME')
    engine = sqlalchemy.create_engine(connect_str, max_identifier_length=128)
    
    conn = engine.connect()
    
    joblib.load('path/to/file.dump') # <- ここで暗黙的にsklearnが使用されている
    
  • 좋은 웹페이지 즐겨찾기