Pythonの+ CGIスクリプトは、環境変数にアクセスすることはできません
質問
私は、Oracleデータベースを使用してのpythonのWebサービスをコーディングしています。私はcx_Oracleがインストールされ、作業が、私は、Apacheを使用してCGIとしての私のPythonコードを実行したときに、私はいくつかの問題を抱えている必要があります。
たとえば、次のコードは、コマンドラインで完璧に動作します:
#!/usr/bin/python
import os
import cx_Oracle
import defs as df
os.putenv('ORACLE_HOME', '/oracledb/10.2.0/')
os.putenv('LD_LIBRARY_PATH', '/oracledb/10.2.0/lib')
con = cx_Oracle.Connection(df.DB_USER, df.DB_PASS, df.DB_SID)
print con
しかし、私はCGIとして実行するとき、私は「cx_Oracle.InterfaceError:Oracle環境ハンドルを取得できません」を取得。apacheのエラーログでの
私はネットを検索し、誰もが、私はORACLE_HOME
とLD_LIBRARY_PATH
環境変数を設定していることを述べています。私はあなたがコードを見ることができるようにos.putenv
を使用してそれらを定義する場合でも、どういうわけか、CGIスクリプトは、この環境変数にアクセスすることはできません。
をやっていますか?ありがとう!
解決 7
私はこの問題を解決するために管理してます。
どういうわけか、Apacheが使用していたユーザーおよびグループは、環境変数にアクセスすることはできませんでした。私は、Apacheのは、私は、この変数へのアクセス権を持っていることは確かだったユーザーに使用していたユーザーとグループを変更することで問題を解決しました。
それはそれは、Pythonを使用してこの変数を設定するので、難しいことを奇妙な(とイライラ)です。
私の質問に答えみんなに感謝!
他のヒント
これは私のために働いているます:
os.putenv('ORACLE_HOME', '/oracle/client/v10.2.0.3-64bit')
os.putenv('LD_LIBRARY_PATH', '/oracle/client/v10.2.0.3-64bit/lib')
os.environ['ORACLE_HOME'] = '/oracle/client/v10.2.0.3-64bit'
os.environ['LD_LIBRARY_PATH'] = '/oracle/client/v10.2.0.3-64bit/lib'
まずputenv
は、次にenviron
を更新することに注意します。
あなたはこれを必要があります。
os.environ['ORACLE_HOME'] = '/oracledb/10.2.0/'
os.environ['LD_LIBRARY_PATH'] = '/oracledb/10.2.0/lib'
の代わりにos.putenv()
がos.putenv()
は、おそらく見ているos.environ
を、更新されませんので、cx_Oracle
を使用する。
ドキュメント:雑多なオペレーティングシステムインタフェースの言葉:の "注:を呼び出しますそれははos.environを変更した方が良いですので、putenvを()を直接、はos.environ変更されません。 "の
は、Apacheのためののenv のモジュールを追加することを忘れないでください
a2enmod env
の.htaccessまたはApacheの設定でます:
SetEnv LD_LIBRARY_PATH /oracle_lib_path
での/ etc / apache2の/ envvarsが動作しません。
あなたは完全にこの問題を解消することができます。ここにあなたのボックスにOracle Instant Clientのインストールすることにより、これを行う方法のメモがあります。
ちょうど短いグーグルの問題に、それはあなたの問題が/
で終わるORACLE_HOME
に関連している可能性があります。
それを削除する(ともリッチーからの提案を使用して)試してみて、それが動作するかどうかを確認します。
あなたはシェルスクリプトで環境変数を設定し、CGIを実装するためにシェルスクリプトを使用して、シェルスクリプトからPythonスクリプトを呼び出すことができます。
のpythonの中から、環境変数を設定すると、
...あなたはライブラリがロードされている方法を扱っている場合は特に、トリッキーなものだそうです質問者のコードが機能しなかった理由を、実際の質問にはまだ回答されていません。
答えは、アプリケーションが(この場合はPythonインタプリタで)開始されたときに、環境変数LD_LIBRARY_PATHをのみ評価されていることです。 Pythonは開始されたとき、それは遅すぎる、この変数を台無しにすでにあります。そしてあなたがはos.environやos.putenv使用して(一般的には前者が使用されなければならない)に設定するかどうかは全く問題ではありません。
ソリューションは、Pythonスクリプトを起動するか、すでに設定されている環境変数でApacheを起動するラッパースクリプトにLD_LIBRARY_PATH環境変数を設定することです。 openSUSEの上では、例えばには、/ etc / sysconfig / apache2のでLD_LIBRARY_PATHを設定することにより、後者を行うことができます。
CGIスクリプトの代わりにのmod_wsgiを使用した場合、ところで、同じ問題が存在します。 「Pythonの共有ライブラリを見つけることができません」のmod_wsgi インストールの問題のページのセクションを参照してください。ます。
あなたの文は、順不同でいますか?
#!/usr/bin/python
import os
os.putenv('ORACLE_HOME', '/oracledb/10.2.0/')
os.putenv('LD_LIBRARY_PATH', '/oracledb/10.2.0/lib')
import cx_Oracle
import defs as df
con = cx_Oracle.Connection(df.DB_USER, df.DB_PASS, df.DB_SID)
print con