1
我有一個開發的燒瓶應用程序,可以在燒瓶的嵌入式服務器上成功運行。該應用程序使用用C++編寫的後端。我的C++後端庫在這個文件夾:當我嘗試運行我的燒瓶應用程序時,爲什麼apache不加載我的.so庫?
/home/(USER_NAME)/rf/Dev/Backend/lib/libtestCAF.so
當我運行嵌入式服務器上的應用程序它會找到C++後端代碼並使用它來生成報告。然而,當我運行在Apache上的同一個應用程序,我得到這個錯誤跟蹤:
[Thu Jul 11 14:44:54 2013] [error] [client 127.0.0.1] from main.main import main
[Thu Jul 11 14:44:54 2013] [error] [client 127.0.0.1] File "/home/(USER_NAME)/rf/Dev/Web/main/main.py", line 19, in <module>
[Thu Jul 11 14:44:54 2013] [error] [client 127.0.0.1] from CAF.CAFWrapper import *
[Thu Jul 11 14:44:54 2013] [error] [client 127.0.0.1] File "/home/admin1/rf/Dev/Web/CAF/CAFWrapper.py", line 12, in <module>
[Thu Jul 11 14:44:54 2013] [error] [client 127.0.0.1] lib = cdll.LoadLibrary('../Backend/lib/libtestCAF.so')
[Thu Jul 11 14:44:54 2013] [error] [client 127.0.0.1] File "/usr/lib/python2.7/ctypes/__init__.py", line 443, in LoadLibrary
[Thu Jul 11 14:44:54 2013] [error] [client 127.0.0.1] return self._dlltype(name)
[Thu Jul 11 14:44:54 2013] [error] [client 127.0.0.1] File "/usr/lib/python2.7/ctypes/__init__.py", line 365, in __init__
[Thu Jul 11 14:44:54 2013] [error] [client 127.0.0.1] self._handle = _dlopen(self._name, mode)
[Thu Jul 11 14:44:54 2013] [error] [client 127.0.0.1] OSError: ../Backend/lib/libtestCAF.so: cannot open shared object file: No such file or directory
正如你可以在最後一行看到,它說,libtestCAF.so不存在。同時,嵌入式服務器總是能找到它。
我使用mod_wsgi在Apache服務器上運行瓶型應用程序。我使用的WSGI文件是此文件夾中:
/home/(USER_NAME)/rf/Dev/Web/wsgi/rf.wsgi
...它這樣說:
import sys
sys.path.insert(0,'home/(USER_NAME)/rf/Dev/Web')
from runserver import app as application
這是我的Apache的配置文件:
<VirtualHost *:8100>
ServerName www.relativefinder.com
WSGIDaemonProcess rf user=www-data group=www-data threads=5
WSGIScriptAlias//home/(USER_NAME)/rf/Dev/Web/wsgi/rf.wsgi
<Directory /home/(USER_NAME)/rf/Dev>
WSGIProcessGroup rf
WSGIApplicationGroup %{GLOBAL}
Options Indexes FollowSymLinks MultiViews
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
蟒蛇文件,該文件加載.so文件使用以下代碼:
if SettingsToUse == DEV_CAF:
lib = cdll.LoadLibrary('../Backend/lib/librelativefinder.so')
else:
lib = cdll.LoadLibrary('../Backend/lib/libtestCAF.so')
我很困惑,Apache似乎沒有找到它,但在燒瓶中的嵌入式服務器總是似乎找到它。我需要做什麼,當我運行apache時,它會發現.so文件?
感謝您的鏈接。當我明天開始工作時,我一定會將其更改爲絕對路徑名稱,以檢查它是否有效。但是,我擔心使用絕對路徑名稱的前景,因爲它非常不靈活。有沒有辦法做到這一點,而不使用絕對路徑? – idungotnosn
@idungotnosn os.path.realpath(os.path.join(os.path.dirname(__ file__),「..」,「Backend/lib/librelativefinder.so」))將獲得相對於文件的調用是從。 – davidism
謝謝你!你們是一個很大的幫助。 – idungotnosn