2012-04-01 26 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