Pythonの+ CGIスクリプトは、環境変数にアクセスすることはできません

StackOverflow https://stackoverflow.com/questions/1070525

  •  21-08-2019
  •  | 
  •  

質問

私は、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_HOMELD_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のインストールすることにより、これを行う方法のメモがあります。

環境変数を設定せずにLinux上のOracle instantclientにをインストールします<? />

ちょうど短いグーグルの問題に、それはあなたの問題が/で終わる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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top