我正在尝试从一个使用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,这不是一个选项。
有关如何克服此问题的任何建议?
答案 0 :(得分: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
这是运行批处理脚本而不设置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
答案 1 :(得分:0)
我在去年几乎完全改写了Statistics :: R,以使其更快,平台无关且更强大。我选择通过IPC :: Run来执行对R和各种IO的调用。
显然,您所描述的问题特定于IPC :: Run。因此,您应首先在IPC::Run tracker上提交一张票。我不知道IPC :: Run的作者实现修复是多么可行,但他们至少可以做一个描述不兼容性的警告部分。
如果它满足Statistics :: R的要求(主要使用stdin,stdout和stderr与R通信),则使用IPC :: Run3而不是IPC :: Run in Statistics :: R可能是一个选项。它不是替代品,因此,不是一个微不足道的改变。