2013-07-11 96 views
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文件?

回答

1

因爲您使用的是相對路徑名而不是絕對路徑名。在Apache下運行時的當前工作目錄不會是源代碼的位置。請參閱:

+0

感謝您的鏈接。當我明天開始工作時,我一定會將其更改爲絕對路徑名稱,以檢查它是否有效。但是,我擔心使用絕對路徑名稱的前景,因爲它非常不靈活。有沒有辦法做到這一點,而不使用絕對路徑? – idungotnosn

+0

@idungotnosn os.path.realpath(os.path.join(os.path.dirname(__ file__),「..」,「Backend/lib/librelativefinder.so」))將獲得相對於文件的調用是從。 – davidism

+0

謝謝你!你們是一個很大的幫助。 – idungotnosn

相關問題