2012-04-01 3 views
0

Я пытаюсь создать .exe из простого Perl-скрипта, который использует пакет Statistics :: R.Получение статистики :: 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

Это то, что они говорят:

это происходит потому, IPC :: Run module на Win32 (только) пытается запустить подпроцессы с использованием $^X, который обычно содержит путь к perl.exe. Однако, когда PAR упаковывает исполняемый файл, $^X не , оказывается, указывает на perl.exe, и поэтому IPC :: Run сбой в этой точке. Реализация IPC :: Работа в Windows без использования подпроцессов - нерешенная проблема.

В конце концов, решение потока должно использовать IPC :: Run3, что здесь не вариант.

Любые предложения по устранению этой проблемы?

ответ

2

Я думаю, вы обречены. Просто не создавайте файл .exe - используйте переносчик из клубники и скрипт batch/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

+0

Вы либо собираетесь исправлять статистику :: R, чтобы сделать Windows IPC лучше, либо применить некоторые другие способы обхода horrendus – singingfish

+0

Вероятно! Я отправил по электронной почте разработчику Statistics :: R, чтобы узнать, есть ли у них какие-либо предложения. Еще нет ответа. Я расскажу здесь, что они говорят. – Lozzer

0

Я переписан почти полностью Статистика :: R в в прошлом году, чтобы сделать его более быстрым, независимым от платформы и надежным. Я решил выполнить вызовы R и различных IO через IPC :: Run.

Очевидно, проблема, о которой вы говорите, специфична для IPC :: Run. Итак, сначала нужно подать билет на номер IPC::Run tracker. Я не знаю, насколько это возможно для авторов IPC :: Run для реализации исправления, но, по крайней мере, они могут сделать, это раздел оговорки, в котором описывается несовместимость.

Использование IPC :: Run3 вместо IPC :: Run в статистике :: R может быть вариантом, если он удовлетворяет требованиям статистики :: R (в основном связывается с R, используя stdin, stdout и stderr). Это не было бы заменой, поэтому, не тривиальное изменение.

+0

Я связался с авторами МПК: Запуск.Они заявили, что исправление проблемы прямо сейчас будет очень трудоемким и нетривиальным. Я попытаюсь посмотреть, могу ли я указать модуль на статический путь perl.exe и перейти оттуда. – Lozzer