Python + CGI 스크립트는 환경 변수에 액세스 할 수 없습니다
문제
Oracle 데이터베이스를 사용하는 Python에서 웹 서비스를 코딩하고 있습니다. 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로 실행하면 Apache 오류 로그에서 "CX_ORACLE.INTERFACEERROR : Oracle Environment Hands를 얻을 수 없습니다"를 얻습니다.
나는 그물을 검색했고 모두가 ORACLE_HOME
그리고 LD_LIBRARY_PATH
환경 변수. 어떻게 든 CGI 스크립트는 사용을 정의 할 때에도이 환경 변수에 액세스 할 수 없습니다. os.putenv
코드에서 볼 수 있듯이.
내가 뭘 잘못하고 있니? 감사!
해결책 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
아마도보고 있습니다.
선적 서류 비치: 기타 운영 체제 인터페이스 말 : "참고 : putenv ()를 호출한다고해서 직접 os.environ이 변경되지 않으므로 os.environ을 수정하는 것이 좋습니다."
추가를 잊지 마십시오 env 아파치 모듈 :
a2enmod env
.htaccess 또는 apache 구성 :
SetEnv LD_LIBRARY_PATH /oracle_lib_path
/etc/apache2/envvars에서 작동하지 않습니다
환경 변수를 설정할 필요가 없으면 문제를 완전히 제거 할 수 있습니다. 다음은 상자에 Oracle Instant Client를 설치하여이를 수행하는 방법에 대한 메모입니다.
짧은 일에서 Google 문제에 대해, 당신의 문제는 결말과 관련이있을 수 있습니다. /
안에 ORACLE_HOME
.
그것을 제거하고 (Richie의 제안도 사용) 작동하는지 확인하십시오.
쉘 스크립트를 사용하여 CGI를 구현하고 쉘 스크립트에서 환경 변수를 설정하고 쉘 스크립트에서 Python 스크립트를 호출 할 수 있습니다.
파이썬 내에서 환경 변수 설정은 까다로운 것 같습니다. 특히 라이브러리가로드되는 방식을 다룰 때 ...
질문자의 코드가 작동하지 않은 이유는 아직 답변되지 않았습니다.
대답은 환경 변수 LD_LIBRARY_PATH가 응용 프로그램이 시작될 때만 평가된다는 것입니다 (이 경우 Python 통역사). Python이 시작되었을 때 이미이 변수를 엉망으로 만들기에는 너무 늦었습니다. os.environ 또는 os.putenv를 사용하여 설정했는지 여부는 전혀 중요하지 않습니다 (그러나 일반적으로 전자는 사용해야합니다).
솔루션은 Python 스크립트를 시작하는 래퍼 스크립트에서 LD_LIBRARY_PATH 환경 변수를 설정하거나 해당 환경 변수가 이미 설정된 상태에서 APACHE를 시작하는 것입니다. OpenSuse에서는 예를 들어/etc/sysconfig/apache2에서 ld_library_path를 설정하여 후자를 수행 할 수 있습니다.
그건 그렇고, CGI 스크립트 대신 mod_wsgi를 사용할 때 동일한 문제가 있습니다. mod_wsgi에서 "Python Shared Library를 찾을 수 없음"섹션을 참조하십시오. 설치 문제 페이지.
당신의 진술이 순서대로 나왔습니까?
#!/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