Pergunta

Eu estou codificação um webservice em python que usa um banco de dados Oracle. Eu tenho cx_Oracle instalado e funcionando, mas eu estou tendo alguns problemas quando eu executar o meu código python como CGI usando Apache.

Por exemplo, o seguinte código funciona perfeitamente na linha de comando:

#!/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

Mas quando eu executá-lo como CGI recebo um "cx_Oracle.InterfaceError: Não é possível adquirir o Oracle ambiente punho". No log de erro do apache

Eu procurei na net e todo mundo diz que eu tenho que definir as variáveis ??ORACLE_HOME e meio ambiente LD_LIBRARY_PATH. De alguma forma, o script CGI não podem acessar este variáveis ??de ambiente, mesmo quando eu defini-los usando os.putenv como você pode ver no código.

O que eu estou a fazer errado? Obrigado!

Foi útil?

Solução 7

Eu consegui resolver o problema.

De alguma forma o usuário e grupo que apache estava usando não tem acesso às variáveis ??de ambiente. Eu resolvi o problema alterando o usuário e grupo que apache estava usando para um usuário que eu estava certo de ter acesso a essas variáveis.

É estranho (e frustrante) que é tão difícil de definir essas variáveis ??usando Python.

Obrigado a todos que respondeu à minha pergunta!

Outras dicas

Esse é um trabalho para mim:

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'

Mente que primeiro putenv, então atualização environ.

Você precisa isto:

os.environ['ORACLE_HOME'] = '/oracledb/10.2.0/'
os.environ['LD_LIBRARY_PATH'] = '/oracledb/10.2.0/lib'

em vez de usar os.putenv() porque os.putenv() não atualiza os.environ, que cx_Oracle é presumivelmente olhando.

Documentação: interfaces do sistema operacional Diversos diz: "Nota: Chamada putenv () diretamente não muda os.environ, por isso é melhor para modificar os.environ ".

Não se esqueça de adicionar env módulo para Apache:

a2enmod env

no .htaccess ou apache configuração:

SetEnv LD_LIBRARY_PATH /oracle_lib_path

em / etc / apache2 / envvars não trabalho

Você pode eliminar o problema completamente se você eliminar a necessidade de definir as variáveis ??de ambiente. Aqui está uma nota sobre como fazer isso, instalando o Oracle Instant Client em sua caixa.

instalar o Oracle instantclient no Linux sem definir variáveis ??de ambiente?

A partir de apenas um curto google sobre o problema, pode ser que o seu problema está relacionado com o do / terminando em ORACLE_HOME.
Tente removê-lo (e usando também sugestão de Richie) e ver se funciona.

Você pode usar um shell script para implementar o CGI, definir as variáveis ??de ambiente no shell script e chamar o script python a partir do shell script.

Definir variáveis ??de ambiente de dentro python parece ser uma coisa complicada, especialmente quando você está lidando com a forma como as bibliotecas são carregados ...

A questão real porque o código do entrevistador fez não trabalho ainda não foi respondido.

A resposta é que a variável de ambiente LD_LIBRARY_PATH é avaliada somente quando um aplicativo é iniciado (neste caso, o interpretador Python). Quando Python começou, já é tarde demais para mexer com esta variável; e não importa em tudo se você configurá-lo usando os.environ ou os.putenv (mas geralmente a primeira deve ser usado).

A solução é definir a variável de ambiente LD_LIBRARY_PATH em um script que inicia o script Python, ou para iniciar o Apache com essa variável de ambiente já definido. No OpenSUSE, você pode fazer o último definindo LD_LIBRARY_PATH em / etc / sysconfig / apache2, por exemplo.

A propósito, existe o mesmo problema ao usar mod_wsgi em vez de um script CGI. Consulte a seção "Não foi possível encontrar biblioteca compartilhada Python" na página os problemas de instalação mod_wsgi .

As suas declarações fora de ordem?

#!/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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top