programing

인터페이스 오류:Oracle 환경 핸들을 가져올 수 없습니다. ORACLE_HOME이 올바르고 SQL*Plus가 연결됩니다.

goodsources 2023. 10. 3. 09:13
반응형

인터페이스 오류:Oracle 환경 핸들을 가져올 수 없습니다. ORACLE_HOME이 올바르고 SQL*Plus가 연결됩니다.

cx_Oracle을 가져오려고 하면 표준 "DLL load failed; module not found" 오류가 발생합니다.적절한 인스턴트 클라이언트가 설치되어 있고 경로가 모두 정확합니다...Dependency Walker를 실행하면 다음 .dll의 MSVCR90, GPSVC, IESHIMS가 누락되었다고 합니다.

오라클 11g과 파이썬 2.7용 인스턴트 클라이언트를 실행하고 있습니다.생각나는 사람?제가 찾은 대부분의 답은 잘못된 길을 내포하고 있지만, 사실은 아닌 것 같습니다...게다가 제 시스템 어디에도 그런 .dll을 찾을 수 없습니다.

편집: Oracle XE 11g(32비트)을 설치했습니다. Python 2.7과 cx_Oracle도 모두 32비트입니다(Windows에 있음도 추가해야 합니다).cx_Oracle은 이제 올바르게 설치되지만 연결 시 다음 오류가 표시됩니다.

InterfaceError: Unable to acquire Oracle environment handle

PATH 폴더의 bin과 마찬가지로 ORACRAL_HOME 경로가 정확합니다...

어떤 버전의 Windows를 실행하고 계십니까?32비트인가요 64비트인가요?

Oracle Instant Client가 32비트입니까, 64비트입니까?

Python 설치가 32비트입니까 64비트입니까?

당신의 cx_oracle 버전이 정확합니까? 32비트입니까, 64비트입니까?

MSVCR90.dll은 Microsoft Visual C++ 2008 SP1 재배포 가능 패키지의 일부입니다.

32비트 버전은 여기서, 64비트 버전은 여기서 구할 수 있습니다.

은 입니다 IESHIMS.dll에 .C:\Program Files\Internet Explorer\Ieshims.dll32비트 Windows는 6트 Windows치)는 C:\Program Files\Internet Explorer(x86)\윈도우 버전이 비스타 이상인 경우 Ieshims.dll' (64 비트 윈도우 에서 32 비트 윈도우 위치) 입니다

은 GPSVC.dll 에 .C:\Windows\System32.

IEFrame을 사용하는 Windows Error Reporting에서 사용하기 때문에 Dependency Walker는 이러한 마지막 두 DLL이 누락된 것으로 보고합니다.DLL 및 는 지연 로드되므로 실제로는 필요하지 않을 수도 있습니다.

_ 를(를) 한 다와 .ORACLE_HOME의 PATH합니다가 됩니다.%ORACLE_HOME%/bin, 환경 변수로 설정되거나 레지스트리에 설정되며 tnsnames.or 파일이 TNS_ADM 값에 존재합니다.IN이 로 설정됩니다.Emmanuel의 답변에 명시된 바와 같이, 설정되지 않은 TNS_ADMIN 설정의 기본값은%ORACLE_HOME%\network\admin.

또한 다른 버전과 달리 항상 경로, ORACLE_HOME 또는 TNS_ADM을 설정 또는 유지하도록 보장하지 않기 때문에 꼭 필요한 경우가 아니라면 인스턴트 클라이언트 버전의 오라클 설치 관리자를 거의 사용하지 않았습니다.IN이 올바르지 않아 tnsname.ora 및 OCI.dll을 찾을 수 없습니다.같은 시스템에 여러 개의 Python 버전 또는 Oracle 버전이 있으면 이 문제가 더욱 복잡해집니다.

환경 변수를 명시적으로 설정하려면 제어판의 시스템 아이콘, 고급 시스템 설정 작업, 고급 탭, 환경 버튼에 있는 환경 변수(사용자 또는 시스템)를 사용할 수 있습니다.

에 대하여InterfaceError: Unable to acquire Oracle environment handle는 특히dll을 때 ., 로 OCI.dll합니다 cx_Oracle OCI.dll 를 포함하는 둘의 검색 입니다. 일반적으로 이는 OCI.dll을 포함하는 둘 이상의 검색 디렉토리를 포함하는 PATH 변수 때문입니다.

특히 PATH에 인스턴트 클라이언트 설치나 Oracle 11G XE 설치 중 한 가지 경우에만 OCI.dll이 포함되도록 하는 것이 문제를 해결할 수 있습니다.

Oracle 11G XE를 설치하기 전에 인스턴트 클라이언트를 제거했습니까?

다음을 명령 프롬프트에 붙여 넣습니다.

echo The current ORACLE_HOME is %ORACLE_HOME%

echo The current TNS_ADMIN is %TNS_ADMIN%

echo The current PATH is %PATH%

이러한 변수의 현재 값을 확인합니다.

추가 리소스

를 것입니다. 변수를 설정해야 합니다.ORACLE_HOME예와 일치시키는 Windows: 경우 새 생성 Windows: 구성 시키려면 환경 변수가다되는 의 폴더(예:예:해), Windows: 구성 패널의 환경 변수가 일치합니다.cx_Oracle모듈이 연결될 수 있습니다.

$ORACLE_HOME/network/admin(%ORACLE_HOME%\network\admin우(윈도우)가 입니다.tnsnames.ora파일이 존재해야 합니다.

업데이트 06.10.2020

보안상의 이유로 MacOS DYLD_LIBRARY_PATH가 설정되지 않은 것 같습니다.

NSTask가 있는 번들에서 도우미 프로세스를 시작하거나 exec(2) 명령을 호출하는 등 System Integrity Protection에 의해 제한된 프로세스의 산란 자식 프로세스는 해당 자식 프로세스의 마하 특수 포트를 재설정합니다.DYLD_LIBRARY_PATH와 같은 동적 링커(dyld) 환경 변수는 보호 프로세스를 시작할 때 제거됩니다.

몇 가지 가능한 해결책:

  • env의 스크립트에서 shebang line을 바꿉니다(예:#!/usr/bin/env python2.7)에서 비단뱀에게(#!.../venvs/project11/bin/python2.7) 후술하는 바와 같이
  • 파이썬 스크립트를 호출하는 스크립트에서 DYLD_LIBRARY_PATH를 설정합니다.
  • 스크립트를 다음과 같이 호출합니다.DYLD_LIBRARY_PATH=... <script-to-run>
  • 셸(.bash_profile 등)에 DYLD_LIBRARY_PATH를 설정하고 스크립트를 호출합니다.source/. <script-to-run>

구 분석

제 사례에서 발견한 것은 다음과 같습니다.

  • 재배치 가능 모드(--relocable)의 virtualenv 설정에서는 /usr/bin/env 유틸리티를 django-admin용 shebang으로 사용합니다.py:

    #!/usr/bin/env python2.7
    
  • env는 다양한 nx 환경에서 실행될 수 있는 unix 스크립트를 작성하기 위한 편리한 유틸리티이다.

  • OSX(Macos 10.12 시에라 사용 중)에서 어떤 이유로 /usr/bin/env는 상위 프로세스에 표시되는 일부 시스템 변수를 숨깁니다. 이 경우 DYLD_LIBRARY_PATH가 하위 프로세스로 전송되지 않습니다.테스트:

    set|grep DYLD_LIBRARY_PATH
    DYLD_LIBRARY_PATH=.../oracle/instantclient_11_2
    
    env|grep DYLD_LIBRARY_PATH
    # nothing
    
  • 한 번 더 확인:

    python -c "import os; print os.environ.get('DYLD_LIBRARY_PATH')"
    .../instantclient_11_2:/usr/local/opt/openssl/lib
    
    # put the same line in first line of django-admin.py 
    # and you will get no output for DYLD_LIBRARY_PATH 
    
  • 흥미로운 점은 Linux(예: CentOS)에서는 그렇지 않기 때문에 하위 프로세스에 DYLD_LIBRARY_PATH 및 LD_LIBRARY_PATH가 표시됩니다.

  • 이 cx_oracle.so가 필요한 오라클 라이브러리를 로드할 수 없으므로 오류가 발생하여 실패합니다.

    Unable to acquire Oracle environment handle
    

해결책은 장고 관리자의 shebang을 바꾸는 것에 있습니다.py:

  • 출처:

    #!/usr/bin/env python2.7
    
  • (python venv 설치를 확인하십시오: 어떤 python):

    #!.../venvs/project11/bin/python2.7
    
  • 이 역시 이와 같이 작동하지만 이전 솔루션보다 유연성이 떨어집니다.

    #!/usr/bin/env DYLD_LIBRARY_PATH=<put-full-path->/instantclient_11_2 python2.7
    
  • 또는 cx_Oracle 또는 다른 DYLD_LIBRARY_PATH 종속 모듈을 사용할 OSX에서 재배치 가능한 virtualenv 설정을 사용하지 않는 것이 가장 쉽습니다.

이것을 작동시키기 위해 이것을 많이 다루어야 했던 것을 기억합니다.나의.bash_profileOracle XE를 실행하는 시스템에서 다음과 같은 기능을 제공합니다.

export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export SID=XE
export LD_LIBRARY_PATH=$ORACLE_HOME:$ORACLE_HOME/lib
export PATH=$PATH:$ORACLE_HOME/bin

아마도 '%python_home%'와 같이 '.dll' 확장자가 있는 모든 파일을 Python의 설치 경로에 복사할 수 있을 것입니다.Lib\site-packages'.

언급URL : https://stackoverflow.com/questions/13589683/interfaceerror-unable-to-acquire-oracle-environment-handle-oracle-home-is-corr

반응형