【问题标题】:Why TWiki can't locate a module that is already in the @INC?为什么 TWiki 无法找到已在 @INC 中的模块?
【发布时间】:2010-11-25 21:35:07
【问题描述】:

最近我在我的 RHEL 5 上使用 perl 版本 5.8.8 安装了一些 perl 模块,并且所有安装都很顺利。我可以看到这些模块存在于@INC 中,但我的 TWiki 站点声称它找不到它们返回错误:Can't locate Net/LDAP.pm in @INC(很多包含模块的路径)在TWiki.pm 第 xx 行。当我执行perl -e 'use Net::LDAP'; 时,它不会返回任何内容,这意味着 perl 可以找到该模块。 TWiki 也被正确配置并且工作正常,除了使用我必须安装的特定模块的插件之外,我什至添加了 setLib.cfg 的路径以防万一。

编辑:

which perl 返回/usr/bin/perl

twiki/cgi-bin/view的shebang线是#!/usr/bin/perl -wT

perl -MNet::LDAP -e 'print $INC{"Net/LDAP.pm"}, "\n";' 返回:

/usr/lib/perl5/site_perl/5.8.8/Net/LDAP.pm

apache 错误日志显示:[Tue Nov 16 10:53:47 2010] [error] [client 10.76.14.170] [Tue Nov 16 10:53:47 2010] view: INC /usr/lib/perl5/site_perl/5.8.8 at /usr/local/apache2/htdocs/twiki5_pdc/bin/view line 44. 所以它使用的是正确的路径。

【问题讨论】:

    标签: perl rhel twiki


    【解决方案1】:

    @INC 可能与您的命令行不同 - 要么是因为您使用了不同的 Perl 解释器二进制文件,or other factors affecting @INC

    检查命令行的 @INC: perl -e 'print join(",", sort @INC);' - 并与您提到的 Wiki 错误中打印的 @INC 进行比较。

    您可能需要将目录添加到 Web 服务器的 Perl 的 @INC 中,这些目录存在于命令行中(“如何”取决于您是否在 mod_perl 下运行)。

    【讨论】:

    • 我没有使用 mod_perl 并且“软件错误:”(我认为浏览器上的那个是 Web 服务器的 @INC?)包含与命令行 @INC 相同的路径(我用你给我的命令检查过的那个)。另外我如何查看 Web 服务器的 @INC,我不记得在我的 apache 配置中配置任何 perl 路径。
    【解决方案2】:

    Apache 认为你的 INC 路径是什么和你的命令行 Perl 认为你的 INC 路径通常是两个完全不同的东西。您可能需要在 Apache 配置中设置环境变量 PERL5LIB

    我是 TWiki/FOSwiki 的忠实粉丝,过去曾多次遇到此问题。

    【讨论】:

    • 当我 echo $PERL5LIB 返回一个空行
    【解决方案3】:
    1. 这样做(在很多情况下都有效):

      perldoc -l Net::LDAP
      

      如果文件中有 POD,它会将您指向 .pm。尽管如此,如果它指向一个.pod 文件,.pm 通常在同一目录中。

    2. 然后检查@INC( 之后的列表,看看路径是否在其中。您可能需要修改运行 Apache 的环境,因为它可能不存在。


    因为这对你不起作用,所以应该:

    perl -MNet::LDAP -e 'print $INC{"Net/LDAP.pm"}, "\n";'
    

    如果 perl 实际上 正在加载它,它会告诉你它从哪里加载它。

    【讨论】:

    • 没有找到“Net::LDAP”的文档。尽管我在“/”目录中执行了该命令,但在我在其他目录中执行该命令之前,我认为我在用于构建 Net/LDAP 模块的目录中,它返回了一个文件 LDAP.POD 和它有一个符号链接,但我猜这不是系统中安装的,只是安装的剩余部分。
    • @user452730:试试新建议。
    • 嗯,现在我在浏览器中遇到了同样的错误:[michal@bumas_tst ~]$ perl -MNet::LDAP -e 'use 5.010;说 $INC{"Net/LDAP.pm"};'无法在 @INC 中找到 Net/LDAP.pm(@INC 包含:/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 / usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/ lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .)。 BEGIN 失败——编译中止。
    • 哦,等等,第二次尝试使用您建议使用的最后一个命令,我得到一个描述 Net:LDAP 位置的路径。所以 perl 确实会加载它。 "/usr/lib/perl5/site_perl/5.8.8/Net/LDAP.pm"
    【解决方案4】:

    Horses:您是否查看了installation guide 以确保一切配置正确?

    Zebras:编辑 bin/twiki_cgi 并在 $TWiki::engine->run(): 之前添加:

    warn "ENV $_ => $ENV{$_}" for sort keys %ENV;
    warn "INC $_" for @INC;
    

    grep apache 错误日志中带有 ENV 和 INC 的行。查找带有 PERL5LIB 或 PERLLIB 的 ENV 行。检查 INC 行以确保列出包含 CPAN 库的目录。

    【讨论】:

    • 很好,这很有用,我有一些问题:第二个视图中的那个点是否正确,它的含义是什么?一些带有双斜杠的行也正确吗? (例如/usr/local/apache2/htdocs/twiki5_pdc/lib/CPAN/lib//5.8.8/x86_64-linux-thread-multi)。查看:INC /usr/local/apache2/htdocs/twiki5_pdc/lib 在 /usr/local/apache2/htdocs/twiki5_pdc/bin/查看第 44 行。查看:INC。在 /usr/local/apache2/htdocs/twiki5_pdc/bin/查看第 44 行。
    • @INC 中的点告诉 perl 在当前工作目录中搜索库。在 unixish 平台上,多个连续路径分隔符被视为单个分隔符(// 和 ///// 与 / 相同)。
    【解决方案5】:

    好吧,原因很可能是我以 root 身份安装 perl 模块,并且没有为其他人设置可执行文件,因此 apache 无法执行/使用它们。

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 1970-01-01
      • 2019-07-27
      • 2016-05-13
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多