3

在我的网络应用程序中,我有这段代码:

from rdkit import Chem

这会导致它在 apache 下崩溃,在日志中我可以看到:

[Fri Sep 06 10:35:44 2013] [error] [client 172.22.69.51] ImportError: libRDGeneral.so.1: cannot open shared object file: No such file or directory

看起来这个问题是由 LD_LIBRARY_PATH 引起的,但我在我的 wsgi.py 文件中设置了它:

os.environ['LD_LIBRARY_PATH']='/usr/lib/oracle/11.2/client64/lib:/nfs/public/rw/chembl/utils/RDKit_2012_09_1/lib:/nfs/public/rw/chembl/utils/indigo/lib/Linux/x64/'

以及在 VirtualHost apache conf 中:

<VirtualHost *:8787>
    ...
SetEnv LD_LIBRARY_PATH /usr/lib/oracle/11.2/client64/lib:/nfs/public/rw/chembl/utils/RDKit_2012_09_1/lib:/nfs/public/rw/chembl/utils/indigo/lib/Linux/x64/
</VirtualHost>

我可以在同一台机器上从命令行毫无问题地运行它:

(chembl_webservices)-bash-4.1$ export PYTHONPATH=/nfs/public/rw/chembl/utils/RDKit_2012_09_1/
(chembl_webservices)-bash-4.1$ export LD_LIBRARY_PATH=/nfs/public/rw/chembl/utils/RDKit_2012_09_1/lib
(chembl_webservices)-bash-4.1$ /nfs/public/rw/chembl/utils/virtualenvs/ldc/envs/chembl_webservices/bin/python
Python 2.7.5 (default, Aug  5 2013, 17:00:57) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import rdkit
from rdkit import Chem

当然,我可以让我的脚本打印 LD_LIBRARY_PATH 的实际值,所以我知道它设置正确,文件和路径存在并且权限很好:

ls /nfs/public/rw/chembl/utils/RDKit_2012_09_1/lib -lh
-rwxr-xr-x 1 cbl_adm cbl_pub 406K Aug  8 11:13 libRDGeneral.so.1.2012.09.1

我可以运行 ldd libRDGeneral.so.1.2012.09.1 来查看是否满足所有依赖项:

linux-vdso.so.1 =>  (0x00007fff397ff000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f096ecd5000)
libm.so.6 => /lib64/libm.so.6 (0x00007f096ea50000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f096e83a000)
libc.so.6 => /lib64/libc.so.6 (0x00007f096e4a7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f096f22d000)

那么有什么问题呢?我还可以做些什么?我该如何调试它?请帮忙。

4

1 回答 1

2

启动 Apache 时,必须在 Apache 进程之外的环境中设置 LD_LIBRARY_PATH。Apache 启动后,无法在您的 Web 应用程序中设置它。

您应该做的是重新编译 rdkit 模块并设置:

LD_RUN_PATH=/nfs/public/rw/chembl/utils/RDKit_2012_09_1/lib

编译时在环境中。在 Python C 扩展模块的编译时设置 LD_RUN_PATH 将导致该目录嵌入到 Python C 扩展模块中,以便它知道在运行时在哪里可以找到库,而无需设置 LD_LIBRARY_PATH。

于 2013-09-11T01:19:54.487 回答