بايثون + CGI script لا يمكن الوصول إلى متغيرات البيئة

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

  •  21-08-2019
  •  | 
  •  

سؤال

أنا الترميز خدمة ويب على الثعبان الذي يستخدم قاعدة بيانات Oracle.لدي cx_Oracle تثبيت العامل ولكن أواجه بعض المشاكل عند تشغيل كود بايثون مثل CGI باستخدام أباتشي.

على سبيل المثال التعليمات البرمجية التالي يعمل تماما في سطر الأوامر:

#!/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_HOME و LD_LIBRARY_PATH متغيرات البيئة.بطريقة أو بأخرى CGI script لا يمكن الوصول إلى هذا متغيرات البيئة حتى عندما تحدد لهم باستخدام os.putenv كما ترى في الكود.

ما أنا به خطأ ؟ وذلك بفضل!

هل كانت مفيدة؟

المحلول 7

ولقد تمكنت من حل المشكلة.

وبطريقة ما للمستخدم والمجموعة التي كانت تستخدم اباتشي لم يكن لديك الوصول إلى متغيرات البيئة. أنا حل المشكلة عن طريق تغيير المستخدمين والمجموعات التي اباتشي كانت تستخدم للمستخدم أن كنت على يقين من أن يكون الوصول إلى هذه المتغيرات.

وإنه لأمر غريب (ومحبطة) أنه من الصعب جدا أن تعيين هذه المتغيرات باستخدام بيثون.

وشكرا للجميع أن الإجابة على سؤالي!

نصائح أخرى

ويعمل هذا بالنسبة لي:

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

في .هتكس أو اباتشي التكوين:

SetEnv LD_LIBRARY_PATH /oracle_lib_path

في /etc/apache2/envvars لا يعمل

يمكنك القضاء على هذه المشكلة تماما إذا كنت القضاء على الحاجة إلى تعيين متغيرات البيئة.وهنا ملاحظة حول كيفية القيام بذلك عن طريق تثبيت Oracle Instant العميل على المربع الخاص بك.

تثبيت أوراكل Instantclient على لينكس دون تحديد البيئة المتغيرات ؟

ومن مجرد جوجل على المشكلة، فإنه يمكن أن يرتبط مشكلتك لو/ تنتهي في ORACLE_HOME.
محاولة إزالته (واستخدام أيضا اقتراح من ريتشي) ونرى ما اذا كان يعمل.

هل يمكن استخدام شيل لتنفيذ CGI، تعيين متغيرات البيئة في شيل واستدعاء النصي الثعبان من شيل.

ومتغيرات البيئة إعداد من داخل الثعبان ويبدو أن شيء صعب، وخصوصا عندما كنت تتعامل مع كيفية تحميل مكتبات ...

ولم يتم الإجابة على السؤال الحقيقي لماذا رمز السائل ولم تنجح.

والجواب هو أن LD_LIBRARY_PATH متغير البيئة يتم تقييم فقط عند بدء تطبيق (في هذه الحالة مترجم Python). عندما بدأت بيثون، هو بالفعل في وقت متأخر جدا لفوضى مع هذا المتغير. وأنه لا يهم على الإطلاق ما إذا كنت تعيين باستخدام os.environ أو os.putenv (ولكن عموما السابق ينبغي أن تستخدم).

والحل هو تعيين متغير البيئة LD_LIBRARY_PATH في برنامج نصي المجمع الذي يبدأ السيناريو بيثون، أو لبدء أباتشي مع هذا المتغير البيئة وضعت بالفعل. في زحمة، يمكنك أن تفعل هذا الأخير من خلال وضع LD_LIBRARY_PATH في / etc / sysconfig / apache2، على سبيل المثال.

وبالمناسبة، يوجد نفس المشكلة عند استخدام mod_wsgi بدلا من برنامج نصي CGI. راجع قسم "تعذر العثور المكتبة المشتركة بيثون" على الصفحة مشكلات التثبيت 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