38

Python から Oracle にアクセスするにはどうすればよいですか? cx_Oracle msi インストーラをダウンロードしましたが、Python でライブラリをインポートできません。

次のエラーが表示されます。

import cx_Oracle

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    import cx_Oracle
ImportError: DLL load failed: The specified module could not be found.

どんな助けにも感謝します。

4

10 に答える 10

37

これが私のために働いたものです。私の Python と Oracle のバージョンはあなたのものとは少し異なりますが、同じアプローチが適用されるはずです。cx_Oracle バイナリ インストーラーのバージョンが、Oracle クライアントと Python のバージョンと一致していることを確認してください。

私のバージョン:

  • パイソン 2.7
  • Oracle インスタント クライアント 11G R2
  • cx_Oracle 5.0.4 (Unicode、Python 2.7、Oracle 11G)
  • Windows XP SP3

手順:

  1. Oracle インスタント クライアント パッケージをダウンロードします。私は、instantclient-basic-win32-11.2.0.1.0.zip を使用しました。C:\your\path\to\instantclient_11_2 に解凍します。
  2. cx_Oracle バイナリ インストーラをダウンロードして実行します。cx_Oracle-5.0.4-11g-unicode.win32-py2.7.msi を使用しました。すべてのユーザーにインストールし、レジストリで見つかった Python 2.7 の場所を指定しました。
  3. ORACLE_HOME および PATH 環境変数を、バッチ スクリプトまたはアプリ コンテキストで意味のある任意のメカニズムを介して設定し、それらが Oracle Instant Client ディレクトリを指すようにします。以下の oracle_python.bat ソースを参照してください。これにはもっと洗練された解決策があるはずですが、システム全体の変更をできるだけ制限したかったのです。対象の Oracle Instant Client ディレクトリを PATH の先頭 (または少なくとも他の Oracle クライアント ディレクトリの前) に配置してください。現在、私はコマンド ラインでのみ作業を行っているため、cx_Oracle を必要とするプログラムを実行する前に、シェルで oracle_python.bat を実行するだけです。
  4. regedit を実行し、\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE に NLS_LANG キーが設定されているかどうかを確認します。その場合は、キーの名前を変更する (私は NLS_LANG_OLD に変更しました) か、設定を解除します。このキーは、Oracle 7 クライアントのデフォルトの NLS_LANG 値としてのみ使用する必要があるため、Oracle 7 クライアントを別の場所で使用していない限り、削除しても安全です。いつものように、変更を行う前に必ずレジストリをバックアップしてください。
  5. これで、Python プログラムに cx_Oracle をインポートできるはずです。以下の oracle_test.py ソースを参照してください。私のバージョンの cx_Oracle では、接続と SQL 文字列を Unicode に設定する必要があったことに注意してください。

ソース: oracle_python.bat

@echo off
set ORACLE_HOME=C:\your\path\to\instantclient_11_2
set PATH=%ORACLE_HOME%;%PATH%

ソース: oracle_test.py

import cx_Oracle

conn_str = u'user/password@host:port/service'
conn = cx_Oracle.connect(conn_str)
c = conn.cursor()
c.execute(u'select your_col_1, your_col_2 from your_table')
for row in c:
    print row[0], "-", row[1]
conn.close()

考えられる問題:

  • 「ORA-12705: NLS データ ファイルにアクセスできないか、指定された環境が無効です」 - NLS_LANG レジストリを変更する前に、この問題に遭遇しました。
  • 「TypeError: 引数 1 は、str ではなく Unicode でなければなりません」 - 接続文字列を Unicode に設定する必要がある場合。
  • 「TypeError: Expecting None or a string」 - SQL 文字列を Unicode に設定する必要がある場合。
  • 「ImportError: DLL の読み込みに失敗しました: 指定されたプロシージャが見つかりませんでした。」- cx_Oracle が適切な Oracle クライアント DLL を見つけられないことを示している可能性があります。
于 2011-01-24T16:33:17.343 に答える
3

Oracle インスタント クライアントに加えて、Oracle ODAC コンポーネントをインストールし、それらへのパスをシステム パスに入れる必要がある場合もあります。cx_Oracle は、一緒にインストールされる oci.dll ファイルにアクセスする必要があるようです。

また、python、cx_Oracle、およびインスタント クライアントのバージョンに一致する正しいバージョン (32 ビットまたは 64 ビット) を取得していることも確認してください。

于 2012-03-16T10:48:41.727 に答える
2

これら2つを確認してください。動作するはずです:-

  1. Python、Oracle インスタントクライアント、および cx_Oracle は 32 ビットです。
  2. 環境変数を設定します。

チャームのようなウィンドウでこの問題を修正します。

于 2013-04-26T11:53:04.810 に答える
2

cx_Oracle に加えて、cx_Oracle がそれを見つけるために、Oracle クライアント ライブラリをインストールし、パスを正しく設定する必要があります欠落しているDLLが何であるかを確認してください。

于 2010-08-19T18:54:57.090 に答える
2

virtualenv を使用している場合、インストーラーを使用してドライバーを取得するのは簡単ではありません。次にできること: Devon の説明に従ってインストールします。次に cx_Oracle.pyd と cx_Oracle-XXX.egg-info フォルダーを Python\Lib\site-packages から仮想環境の Lib\site-packages にコピーします。もちろん、ここでもアーキテクチャとバージョンが重要です。

于 2015-04-02T08:43:49.650 に答える