1

我有一个开发的烧瓶应用程序,它在烧瓶的嵌入式服务器上成功运行。该应用程序使用用 C++ 编写的后端。我的 C++ 后端的库位于此文件夹中:

/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 文件的 python 文件使用以下代码:

if SettingsToUse == DEV_CAF:
    lib = cdll.LoadLibrary('../Backend/lib/librelativefinder.so')
else:
    lib = cdll.LoadLibrary('../Backend/lib/libtestCAF.so')

我很困惑 Apache 似乎没有找到它,但烧瓶中的嵌入式服务器似乎总是能找到它。我需要做什么才能在我运行 apache 时找到那个 .so 文件?

4

1 回答 1

1

因为您使用的是相对路径名而不是绝对路径名。在 Apache 下运行时的当前工作目录将不是您的源代码所在的位置。看:

于 2013-07-11T22:28:40.630 回答