2012-04-01 75 views
0

我试图从使用Statistics :: R包的简单perl脚本创建一个.exe。获取统计信息:: R与PerlApp(或PAR)一起使用

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 (only)上的IPC :: Run模块尝试使用$^X运行子进程,$^X通常包含perl.exe的 路径。但是,当PAR打包可执行文件时,$^X不会发生 碰巧指向perl.exe,因此IPC :: Run在此时失败。 实现IPC ::在Windows上运行而不使用子进程是一个未解决的问题。

最后,线程解决方案是使用IPC :: RUN3,这是不是一个不错的选择。

有关如何解决此问题的任何建议?

回答

2

我认为你注定了。只要不要制作一个.exe文件 - 使用草莓便携式,以及一个批处理/ vbs脚本来运行你的东西。统计:: 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 

而这里的VBS脚本,并且不需要建立一个cmd窗口中运行批处理脚本:

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 
+0

谢谢,但统计:: R需要一个更大的项目,必须通过exe分发。其他一切都很好,但这个模块造成了麻烦。我同意一个很好的R/perl桥将会非常出色。 – Lozzer 2012-04-02 08:55:58

+0

你要么修补Statistics :: R来更好地处理windows IPC,要么应用其他一些horrendus解决方法 – singingfish 2012-04-02 22:15:46

+0

可能!我通过电子邮件发送了统计:: R的开发者,看他们是否有任何建议。尚未回复。我会在这里汇报他们说的。 – Lozzer 2012-04-03 09:46:17

0

我重写了几乎全部统计::中的R去年使其更快,平台无关和强大。我选择通过IPC :: Run来执行对R和各种IO的调用。

显然,您所描述的问题似乎是针对IPC :: Run的。所以,你应该先在IPC::Run tracker上提交一张票。我不知道IPC :: Run的作者实现修复的可行性如何,但他们能做的至少有一个警告部分描述了不兼容性。

如果IPC :: Run3满足Statistics :: R(主要使用stdin,stdout和stderr与R通信)的要求,则可以使用IPC :: Run3代替IPC :: Run :: Statistics :: R。这不会是一个直接替代,所以,不是一个小小的变化。

+0

我联系了IPC:Run的作者。他们表示,现在解决问题将是非常耗时和不平凡的。我将试着看看我能否将模块指向静态perl.exe路径并从那里开始。 – Lozzer 2012-04-05 16:50:04