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 モジュールが、通常 perl.exe へのパスを含む $^X を使用してサブプロセスを実行しようとするために発生します。ただし、PAR が実行可能ファイルをパックするとき、$^X はたまたま perl.exe を指していないため、IPC::Run はその時点で失敗します。サブプロセスを使用せずに IPC::Run を Windows に実装することは未解決の問題です。

最終的に、スレッドの解決策は 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

コマンド ウィンドウを設定せずにバッチ スクリプトを実行する 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 の IPC::Run の代わりに IPC::Run3 を使用することは、Statistics::R の要件を満たしている場合にオプションになる場合があります (主に stdin、stdout、および stderr を使用して R と通信します)。ドロップインの交換ではないため、些細な変更ではありません。

于 2012-04-04T06:17:57.250 に答える