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フォルダのビンも正しいです。
同じ問題が発生しました。変数Oracle_HOME
をOracleクライアントフォルダに一致するように設定する必要があります(Unixの場合:シェル経由、Windowsの場合:環境変数に存在しない場合は新しい変数を作成します)これは、cx_Oracle
モジュールがリンクできる方法であるためです。
フォルダ$Oracle_HOME/network/admin
(Windowsでは%Oracle_HOME%\network\admin
)は、tnsnames.ora
ファイルが存在する場所です。
どのバージョンの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%
これらの変数の現在の値を確認します。
その他のリソース
私の場合、私が発見したことは次のとおりです。
再配置可能モード(--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セットアップを使用しないでください
私はそれを機能させるためにこれを台無しにしなければならなかったことを思い出しますたくさん。私の.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