【问题标题】:Getting Statistics::R to work with PerlApp (or PAR)让 Statistics::R 与 PerlApp(或 PAR)一起工作
【发布时间】:2012-04-01 09:13:53
【问题描述】:

我正在尝试从使用 Statistics::R 包的简单 perl 脚本制作 .exe。

use Statistics::R;
use strict;
my $R = Statistics::R->new();
$R->startR;
$R->send('x=10');
$R->send('x');
my $ret = $R->read;
print $ret;
$R->stopR();

在我创建 perlapp .exe 文件之前一切正常。当我对此进行测试时,出现以下错误:

Inappropriate I/O control operation: Win32::Process::Create() at /<C:\@programming\r\trying_r_bridge.exe>IPC/Run.pm line 2105
Inappropriate I/O control operation: Win32::Process::Create() at /<C:\@programming\r\trying_r_bridge.exe>IPC/Run.pm line 2224
Inappropriate I/O control operation: Win32::Process::Create() at /<C:\@programming\r\trying_r_bridge.exe>IPC/Run.pm line 2224

我在网上查到这个问题的帖子:http://www.nntp.perl.org/group/perl.par/2011/05/msg5022.html

他们是这样说的:

这是因为 Win32 上的 IPC::Run 模块 (仅)尝试使用 $^X 运行子进程,它通常包含 perl.exe 的路径。但是,当 PAR 打包可执行文件时,$^X 不会 碰巧指向 perl.exe,因此 IPC::Run 在那一点上失败。 在不使用子进程的情况下在 Windows 上实现 IPC::Run 是一个未解决的问题。

最后,线程解决方案是使用IPC::Run3,这里不是选项。

对于如何克服这个问题有什么建议吗?

【问题讨论】:

    标签: perl r perlapp


    【解决方案1】:

    我认为你注定要失败。只是不要制作 .exe 文件 - 使用草莓可移植文件和批处理/vbs 脚本来运行您的东西。 Statistics::R 是一个非常脆弱的 IIRC 实现。我希望看到有人赞助开发更好的、独立于平台的 R/perl 连接器。同时这里有一个你可以修改的批处理脚本:

      echo off
      set bindir=%~dp0
      set perlpath=%bindir%perl\bin
      set buildpath=%bindir%\bin
      set PATH=%PATH%;%perlpath%;%buildpath%
      "%perlpath%\perl.exe" "%bindir%myscript.pl
    

    这是在不设置 cmd 窗口的情况下运行批处理脚本的 VBS 脚本:

      Set fso = CreateObject("Scripting.FileSystemObject")
      Set WshShell = CreateObject("WScript.Shell")
      WshShell.Run chr(34) &  fso.GetParentFolderName(wscript.ScriptFullName) & "\perlshell.bat"& Chr(34), 0
      Set WshShell = Nothing
    

    【讨论】:

    • 谢谢,但必须通过 exe 分发的更大项目需要统计信息::R。其他一切都很好,但是这个模块引起了麻烦。我同意一个好的 R/perl 桥会很棒。
    • 您要么修补 Statistics::R 以更好地执行 Windows IPC,要么应用其他一些 horrendus 解决方法
    • 可能!我已经给 Statistics::R 的开发者发了邮件,看看他们有没有什么建议。还没有回复。我会在这里报告他们所说的话。
    • 我认为您的解决方案是滴灌“必须作为单个自包含 .exe 分发”的要求,或者继承或分叉您自己的统计版本::R 以使用 IPC::Run3 (并放弃 IPC::Run3 不是选项的其他要求)。
    【解决方案2】:

    去年,我几乎完全重写了 Statistics::R,以使其更快、独立于平台且健壮。我选择通过 IPC::Run 执行对 R 和各种 IO 的调用。

    显然,您描述的问题似乎特定于 IPC::Run。因此,您应该首先在IPC::Run tracker 上提交票证。我不知道 IPC::Run 的作者实施修复的可行性如何,但他们至少可以有一个警告部分来描述不兼容性。

    如果满足 Statistics::R 的要求(主要使用标准输入、标准输出和标准错误与 R 通信),在 Statistics::R 中使用 IPC::Run3 代替 IPC::Run 可能是一个选项。它不会是一个直接替代品,所以不是一个微不足道的改变。

    【讨论】:

    • 我联系了 IPC:Run 的作者。他们说,现在解决问题将非常耗时且非常重要。我将尝试看看是否可以将模块指向静态 perl.exe 路径并从那里开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2016-10-06
    • 2011-11-30
    • 2014-02-19
    • 2011-09-03
    • 2013-05-01
    • 2018-05-30
    相关资源
    最近更新 更多