是否有一个已知的技巧可以创建一个mod_perl
处理程序,该处理程序使用一些稍微涉及的Inline::Python
?
我创建了以下处理程序:
package ApacheHandler::Test;
use 5.010;
use autodie;
use open qw( :std :utf8 );
use strict;
use utf8;
use warnings;
use Inline Config => DIRECTORY => '/tmp/inline';
use Apache2::Const;
use Apache2::Request ();
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Inline Python => <<EOF;
#import numpy
def hello():
return "Hello!"
EOF
sub handler {
my $r = Apache2::Request->new(shift);
$r->content_type("text/plain");
$r->print( hello() );
return Apache2::Const::OK;
}
1;
只要import numpy
仍然被注释掉,它就可以正常工作。如果我取消注释这一行,Apache会在重新启动时立即断言,我在dmesg
中看到类似的内容:
[9136481.110798] / usr / sbin / apach [10933]:segfault at 7f83df8e6749 ip 00007f83df2aa470 sp 00007fffa1ebe818 libpython2.7.so.1.0中的错误4 [7f83df1c5000 + 281000]
请注意numpy
是通过pip
安装的。我已尝试导入通过pip
安装的其他一些软件包,这些软件包位于同一位置(/usr/local/lib/python2.7/dist-packages
),并遇到了同样的问题。
我尝试过这些方法:
import sys
sys.path.append('/usr/local/lib/python2.7/dist-packages')
没有改变。我没有想象力尝试尝试启用和禁用mod_python
,但没有任何变化。
此外,我尝试运行相同的脚本,改编为CGI,它可以工作。
我试过完全无法在gdb
内启动Apache,所以我没有更准确的错误消息,但我希望我已经为那些了解{{1}的人准确地指出了这个问题。或者Python或mod_perl
能够看到发生了什么。
更新:其他但不是非常有用的调试信息
我刚才有一个好主意:加载Apache2::Reload
,用“正确”处理程序重启Apache(即Inline
注释掉),将import
附加到Apache的一个孩子身上,删除处理程序Python中的gdb
并加载页面。
它没有段错误,但我 在错误日志中收到了有用的消息:
[Sun Jun 01 11:24:46 2014] [错误] [客户端152.81.2.175]无法在/处创建目录路径'/tmp/inline/lib/auto/ApacheHandler/Test_771f'.nnn usr / local / share / perl / 5.14.2 / ApacheHandler / Test.pm第16行。\ n \ nBEGIN失败 - 编译在/usr/local/share/perl/5.14.2/ApacheHandler/Test.pm第23行中止。\ nCompilation在/usr/share/perl5/Apache2/Reload.pm第181行的require中失败。\ n
这指出了一个非常现实的问题:#
中的许多路径都是由root创建的。所以我做了/tmp/inline
,其中使chown -R www-data /tmp/inline
工作(!)成为处理程序,但是当我重新启动Apache时,它再次发生了分段,尽管{{1 仍然可以通过root和www-data写入。
所以,除非我误解了这里发生的事情,否则我仍然没有找到如何让Apache和import
一起工作。