2012-03-08 60 views
2

我正在为我编写的库编写测试脚本,并且作为测试的一部分,我正在清除$ ENV {PATH}变量以确保我放在我的路径中的东西不会导致成功。该库将所需的路径附加到PATH变量。如果PATH env变量初始化,Perl IPC :: Cmd不运行应用程序

为了背景,我在32位Windows XP上运行Strawberry Perl v5.12.0。 IPC :: Cmd的版本是0.76,IPC :: Open3的版本是1.05。

我看到的错误是,如果我清除PATH变量然后设置它,使用IPC :: Open3的IPC :: Cmd找不到该应用程序。如果我不这样做,那么它会运行良好。下面是说明了这个错误的脚本示例:

use strict; 
use warnings; 
use IPC::Cmd qw(run); 

$ENV{PATH} = ''; 
$ENV{PATH} = 'c:\\strawberry\\perl\\bin'; 

my ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf) = 
    run(command => 'perl -v', verbose => 0); 

if ($success) { 

    print 'Success: '; 
    print join("\n", @{$stdout_buf}); 
} else { 

    print 'Failure: '; 
    print join("\n", @{$full_buf}); 
} 
exit 0; 

如果我运行它像这样,它打印的故障线路,如果我有两个$ENV{PATH} =注释掉运行它,然后它打印成功行。我已经试过用第二条PATH行来改变斜杠并在最后添加斜杠,但这没有什么好处。

我已经通过调试器运行了这个,并且IPC :: Open3中的行398发生了故障: $pid = eval { system 1, @_ }; # 1 == P_NOWAIT。如果我在此行后面检查$!,它会告诉我'没有这样的文件或目录'。 PATH在这一点上仍然是正确的,它在任何时候都不会被修改。

另外还有一个奇怪的地方,我试过在重置PATH后使用IPC :: Cmd中的can_run方法,它会发现没有问题的命令。

在为此提交一个错误报告之前,有没有人看过这个并知道如何解决它?另外,对于我想要做的,这是正确的方式,还是有更好的方法来重置PATH变量进行测试?

+0

在清除/重置之前,$ ENV {PATH}设置为什么? – vmpstr 2012-03-08 16:06:04

+0

@vmpstr谢谢你,我慢慢地记住了这一点。由于这是Windows,%windir%\ system32也必须位于路径中。我补充说,它的工作原理。 – Joel 2012-03-08 16:13:25

回答

2

这里的问题是Windows在PATH env变量中也需要%windir%\ system32。添加这个,'c:\ strawberry \ perl \ bin'解决了这个问题。

1

您已选择将“command”作为字符串提交,而不是数组ref。

您确定无法找到的文件是perl.exe而不是cmd.exe吗?