2

cx_Oracleを使用してOracleデータベースに接続する小さなPythonアプリがいくつかあります。これらのアプリは、多くの場合正常に機能するpy2exeを使用してコンパイルすることでデプロイします。

問題は、これをインストールする必要のある多くの人々に標準のOracle Clientバージョン(たとえば、9iおよび10g)がないことであり、すべての人に単一のOracleClientバージョンで標準化させようとするのは非常に苛立たしいことです。現在、9i用のcx_Oracle 4.4.1で9.2クライアントを使用しているため、py2exeを実行すると、結果のexeにはcx_Oracle 4.4.1ライブラリが含まれ、10gクライアントでは機能しません。

Oracleのどのバージョンの特定の機能も使用していないため、cx_Oracleの互換性の問題を除いて、使用されているクライアントのバージョンを気にする必要はありません。

理想的な解決策は、マシンにインストールされているOracleClientから完全に独立したバージョンを何らかの方法でコンパイルすることです。

それが不可能な場合は、Oracleのメジャーバージョン(my_app_9i.exe、my_app_10g.exeなど)ごとに個別のexeをコンパイルしますが、新しいcx_Oracleをインストールすると、古いバージョンでは、変更を加えるたびに他のバージョンをコンパイルするためにライブラリを前後に交換し続ける必要がありました。

アドバイスやその他のオプションは大歓迎です。

4

1 に答える 1

3

複数の cx_Oracle バージョン (例: cx_Oracle10g、cx_Oracle11g など) をビルドする場合は、cx_Oracle setup.py スクリプトを変更する必要があります。setup()スクリプトの最後のステップは;の呼び出しです。最初のパラメーターは、ビルドするモジュールの名前です。に変更"cx_Oracle"するだけ"cx_Oracle" + verで、ver は10g11gなどになります。いくつかのスクリプトを作成してハードコードするか、別のパラメータを に追加setup.pyして動的に選択します。

もちろん、それを取得したら、実行時に正しいモジュールをロードするメカニズムが必要です。そのためには、次のようなファイルを持つ独自のcx_Oracleモジュールを作成する必要があります。__init__.py

try:
  from cx_Oracle9g import *
except ImportError:
  try:
    from cx_Oracle10g import *
  except ImportError:
    try:
      from cx_Oracle11g import *

必要なことは、カスタムcx_Oracleモジュールと正しいcx_OracleXgモジュールをアプリケーションと共に出荷することだけです。

cx_Oracle別の方法として、使用可能な各 Oracle クライアント ライブラリ (9g、10g、11g など) をカスタムモジュールで動的にチェックし、一致する正しいcx_OracleXgモジュールのみをインポートすることもできます。この場合、カスタムcx_Oracleモジュールとすべてのモジュールを含む単一のバイナリを出荷するだけで済みcx_OracleXgます。

于 2010-09-01T22:01:02.910 に答える