web-dev-qa-db-ja.com

InterfaceError:Oracle環境ハンドルを取得できません。 Oracle_HOMEは正しく、SQL * Plusが接続します

Cx_Oracleをインポートしようとすると、標準の「DLLのロードに失敗しました。モジュールが見つかりません」というエラーが発生します。適切なインスタントクライアントがインストールされていますが、パスはすべて正しいです... Dependency Walkerを実行すると、次の.dllのMSVCR90、GPSVC、IESHIMSが欠落していると表示されます。

Oracle11gとPython 2.7のインスタントクライアントを実行しています。誰かアイデアがありますか?私が見つけた答えのほとんどは間違ったパスを伴いますが、そうではないようです。 ...さらに、これらの.dllはシステムの他の場所にありません。

編集:Oracle XE 11g(32ビット)をインストールすることになりました。 Python 2.7とcx_Oracleも32ビットです(Windowsを使用していることも追加する必要があります)。cx_Oracleは正常にインストールされますが、接続時にエラーが発生します。

InterfaceError: Unable to acquire Oracle environment handle

Oracle_HOMEパスは正しく、PATHフォルダのビンも正しいです。

12
Victoria Price

同じ問題が発生しました。変数Oracle_HOMEをOracleクライアントフォルダに一致するように設定する必要があります(Unixの場合:シェル経由、Windowsの場合:環境変数に存在しない場合は新しい変数を作成します)これは、cx_Oracleモジュールがリンクできる方法であるためです。

フォルダ$Oracle_HOME/network/admin(Windowsでは%Oracle_HOME%\network\admin)は、tnsnames.oraファイルが存在する場所です。

4
Emmanuel

どのバージョンのWindowsを実行していますか? 32ビットですか64ビットですか?

Oracle Instant Client 2 または 64 ビットですか?

あなたのPythonインストール 2 または 64 ビットですか?

Cx_Oracleは正しいバージョンですか? 2 または 64 ビット?

MSVCR90.dllは、Microsoft Visual C++ 2008SP1再頒布可能パッケージの一部です。

利用可能な32ビットバージョン ここ 、利用可能な64ビットバージョン ここ

IESHIMS.dllは、C:\Program Files\Internet Explorer\Ieshims.dll(32ビットWindowsの場所または64ビットWindowsの場所)またはC:\ Program Files\Internet Explorer(x86)\ Ieshims.dll`(64ビットWindowsの32ビットWindowsの場所)にあります。 、WindowsのバージョンがVista以降の場合。

GPSVC.dllはC:\Windows\System32に存在する必要があります。

Dependency Walkerは、IEFrame.DLLを使用し、遅延ロードされるWindowsエラー報告によって使用されるため、これらの最後の2つのDLLが欠落していると報告します。つまり、実際には必要ない場合があります。

Cx_Oracleを正常にインポートするには、依存関係のバージョンが一致していることを確認する必要があることがわかりました。また、OracleクライアントのインストールがOracle_HOMEと一致し、PATH変数に%Oracle_HOME%/binが含まれていることを確認する必要があります。これは、環境変数またはレジストリに設定されており、tnsnames.oraファイルが値TNS_ADMINはに設定されます。 Emmanuelの回答に記載されているように、未設定のTNS_ADMIN設定のデフォルト値は%Oracle_HOME%\network\adminです。

また、絶対に必要な場合を除いて、Oracleインストーラのインスタントクライアントバージョンを使用することはめったにありません。他のバージョンとは異なり、Path、Oracle_HOME、またはTNS_ADMINが正しく設定または維持されていることを常に確認しているわけではないため、tnsnames.oraおよびOCI.dllが見つかりました。同じマシン上に複数のPythonバージョンまたはOracleバージョンがある場合、これはより複雑になります。

それらを明示的に設定するには、コントロールパネルの[システム]アイコン、[システムの詳細設定]タスク、[詳細設定]タブ、[環境]ボタンの下にある環境変数(ユーザーまたはシステム)を使用できます。

InterfaceError: Unable to acquire Oracle environment handleに関して、これは特にOCI.dllを解決しない場合に発生し、cx_Oracleは使用するOCI.dllを認識しません。通常、これは、OCIを含む2つ以上の検索ディレクトリを含むPATH変数が原因です。 .dll。

具体的には、PATHにインスタントクライアントのインストールまたはOracle 11GXEインストールからのOCI.dllのインスタントが1つだけ含まれていることを確認すると、問題が解決するはずです。

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%

これらの変数の現在の値を確認します。

その他のリソース

8
Appleman1234

私の場合、私が発見したことは次のとおりです。

  • 再配置可能モード(--relocatable)でのvirtualenvセットアップは、Django-admin.pyの Shebang として / usr/bin/env ユーティリティを使用します。

    #!/usr/bin/env python2.7
    
  • env は、さまざまなnx環境で実行できるUNIXスクリプトを作成するための便利なユーティリティです。

  • OSX(私はmacos 10.12 Sierraを使用しています)何らかの理由で/ usr/bin/envはいくつかのシステム変数を非表示にします親プロセスに表示-この場合DYLD_LIBRARY_PATHは子プロセスに転送されません。テスト:

    set|grep DYLD_LIBRARY_PATH
    DYLD_LIBRARY_PATH=.../Oracle/instantclient_11_2
    
    env|grep DYLD_LIBRARY_PATH
    # nothing
    
  • もう1つのチェック::

    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は必要なOracleライブラリをロードできず、エラーで失敗します。

    Unable to acquire Oracle environment handle
    

解決策は、Django-admin.pyでShebangを変更することです。

  • から:

    #!/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セットアップを使用しないでください

1
Robert Lujo

私はそれを機能させるためにこれを台無しにしなければならなかったことを思い出しますたくさん。私の.bash_profile Oracle 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
0