我在Apache2上使用mod_wsgi在ubuntu上部署我的Django网站。
在我的Django视图中,我导入了一个需要在LD_LIBRARY_PATH中设置特定路径的模块。
当我在/ etc / apache2 / envvars中设置LD_LIBRARY_PATH时:
export LD_LIBRARY_PATH=/home/user/target_libdir:$LD_LIBRARY_PATH
它有效。
但是,在我的服务器上,我使用独立的wsgi脚本运行多个django网站,每个网站都在独立的VirtualHost条目中。
问题是网站需要使用不同的LD_LIBRARY_PATH版本。
那么,如何为每个django网站单独设置LD_LIBRARY_PATH?
答案 0 :(得分:5)
你不能这样做。 LD_LIBRARY_PATH仅在初始进程启动时读取一次。它不能在进程运行时设置,也不能在fork之前再次设置它。你可以在exec之前设置它,但是mod_wsgi守护进程只是fork而不是exec。
答案 1 :(得分:3)
<强>更新强>
以下显然不起作用。把它留在这里作为对他人的警告。
如果您在.wsgi
文件中输入,可能会有效。假设你有类似的东西:
import os,sys
sys.path.append('/path/to/django')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
os.environ['LD_LIBRARY_PATH'] = '/path/to/library'
import django.core.handlers.wsgi
_application = django.core.handlers.wsgi.WSGIHandler()
def application(environ,start_response):
return _application(environ,start_response)
答案 2 :(得分:2)
有些情况下,您无法在脚本运行之前设置LD_LIBRARY_PATH变量,并且您仍想导入一个或两个自定义库 - 比如说,您可以从托管服务器上的主目录中导入几乎没有访问权限,或为上述问题中的每个网站自定义。
在这些无法获得所有合理解决方案的情况下,您可以使用ctypes加载库,然后导入使用它们的模块。很容易采用这个想法从每个站点的自定义文件夹加载所有库,就像上面的问题一样。
因此,我对libpuzzle的问题有一个依赖,我最终做了:
from ctypes import *
lib1 = cdll.LoadLibrary('/home/username/lib/libpuzzle.so')
lib2 = cdll.LoadLibrary('/home/username/lib/libgd.so')
import pypuzzle