Python + CGI script pode variáveis ??de ambiente não acesso
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!
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