我试图使用一个简单的perl脚本来生成一个.exe,该脚本使用了Statistics::R包。
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在这一点上失败了。实现IPC::在Windows上运行而不使用子进程是一个尚未解决的问题。
最后,线程解决方案是使用IPC::Run3,这在这里不是一个选项。
对于如何克服这个问题,有什么建议吗?
发布于 2012-04-01 11:27:36
我觉得你死定了。只是不要制作一个.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发布于 2012-04-04 06:17:57
我几乎完全重写了统计::r在过去的一年,使它更快,独立的平台和健壮。我选择通过IPC::Run执行对R和各种IOs的调用。
显然,您所描述的问题似乎特定于IPC::Run。因此,您应该首先在IPC::运行跟踪器上提交一张票证。我不知道IPC::Run的作者实现修复的可行性,但他们至少可以做的是有一个描述不兼容性的警告部分。
使用IPC::Run3代替IPC:Run in Statistics::R可能是一个选项,如果它满足Statistics::R的要求(主要使用stdin、stdout和stderr与R通信)。这不会是一个插足的替代,所以,不是一个微不足道的改变。
https://stackoverflow.com/questions/9963247
复制相似问题