【问题标题】:Why don't my system calls work in the Perl program I wrap with pp?为什么我的系统调用不能在我用 pp 包装的 Perl 程序中工作?
【发布时间】:2009-07-10 16:21:18
【问题描述】:

我有一个在 Win32 ActivePerl 上运行的 Perl/POE/Tk 脚本,它使用 system 调用可执行文件。我使用pp 创建了脚本的exe。我可以解压 exe 并在“zip”文件目录的根目录下查看可执行文件,但是当我运行 exe 并尝试使用系统调用的功能时,我得到“找不到文件”类型的错误;

'..\cpau' is not recognized as an internal or external command, 
operable program or batch file.

cpau.exe 是包含的文件之一。

pp 是这样调用的:

pp -i alias3.ico -g -a add_event.job -a add_rec.job -a CPAU.exe -a del_event.job -a del_rec.job -a dnscmd.exe -a eventcreate.exe -o alias_v_3-0.exe alias_poe_V-3_0_par.pl

我猜我需要调整system 调用的路径。我目前正在尝试使用默认路径;

system("cpau -dec -file add_rec.job -nowarn -wait");

我试过这个:

system("..\cpau -dec -file ..\add_rec.job -nowarn -wait");

推理 pp 将脚本放在 \scripts\ 目录中,但并不高兴。有什么建议么?

【问题讨论】:

  • CPAU.exe 是一个单独的文件,如下所示; pp -i alias3.ico -g -a CPAU.exe -a add_event.job -a add_rec.job -a del_event.job -a del_rec.job -a dnscmd.exe -a eventcreate.exe -o alias_v_3-0.exe alias_poe_V-3_0_par.pl fork 可能会有点笨拙,因为整个事情都在 POE 中运行。

标签: perl activeperl par perl-packager


【解决方案1】:

更新:我的下面的建议不起作用。但是,如果其他人有类似的问题,我会留下它们。这个答案显示了很多听起来合理但行不通的事情。

查看discussion following the OP's repost 代码using $ENV{PAR_TEMP} 解决 OP 的问题

供参考

pp docs说:

-a, --addfile=文件|目录 ...

默认情况下,文件以其原始名称放置在 / 包内。

通过使用系统,您要求cmd.exe 查找文件,我现在意识到这可能是一场失败的战斗,除非您有一个名为cpau.exe 的单独可执行文件。我现在没有时间尝试这个,但是你可能必须自己做forkexec,而不是依赖system。如:

exec 'CPAU.exe', @args

上一个答案:

您传递给system 的字符串不包含您认为的内容:

use strict;
use warnings;

my $x= "..\cpau -dec -file ..\add_rec.job -nowarn -wait";

print $x, "\n";
__END__

C:\Temp> fgh
..►au -dec -file ..dd_rec.job -nowarn -wait

使用(根据下面 OP 的评论编辑):

system "..\\cpau -dec -file ../add_rec.job -nowarn -wait";

我也推荐使用system的列表形式:

system '..\\cpau', qw(-dec -file ../add_rec.job -nowarn -wait);

此外,如果您想指定cpau 相对于当前脚本目录的路径,您可能会发现FindBin 很方便。

例如:

#!/usr/bin/perl

use strict;
use warnings;

use FindBin qw($Bin);
use File::Spec::Functions qw( catfile );

my $program = catfile $Bin, '..', 'cpau';

system $program, qw(-dec -file ../add_rec.job -nowarn -wait);

__END__

【讨论】:

  • 或者 "..\\.."'..\..' 如果命令被破坏并且特别处理 / (而不是将它们传递给 Win32 API,它全局理解 / 和 \ 作为路径分隔符)。
  • 试过系统'../cpau', qw(-dec -file ../add_rec.job -nowarn -wait);回来了; '..' 不是内部或外部命令、可运行程序或批处理文件。
  • 系统 '.\\cpau', qw(-dec -file .\\add_rec.job -nowarn -wait);如果 exe 所在的目录中已经有其他文件,则有效,但如果 exe 本身位于目录中,则无效。
  • @jpolache 根据您上面的 cmets 更新了我的答案。
  • 添加了推荐代码。从空目录运行 pp-created exe。错误信息如下; 'C:\cpau' 不是内部或外部命令、可运行程序或批处理文件。
【解决方案2】:

我意识到代码中对可执行文件的另一个调用正在运行。我查看并发现正在运行的调用使用了 backtics 而不是 system() 调用。我将其他调用更改为 backtics,问题就消失了。

`.\\cpau -dec -file .\\del_rec.job -nowarn -wait`;

所以,这解决了问题,为什么要买? win32 shell 中 system() 和 backtic 有什么区别?

说得太早了。这适用于 cpau 已经存在的目录。当我在 c:\temp 中尝试时,我得到“'cpau' 不被识别为内部或外部命令、可运行程序或批处理文件。”错误。非常令人沮丧。

我被难住了。

`cpau -dec -file del_rec.job -nowarn -wait`;

我试过有没有倾斜的“.\\”。无论哪种方式都同样的错误。

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多