0

我正在尝试从使用 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,这里不是一个选项。

关于如何克服这个问题的任何建议?

4

2 回答 2

2

我认为你注定要失败。只是不要制作 .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
于 2012-04-01T11:27:36.263 回答
0

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

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

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

于 2012-04-04T06:17:57.250 回答