Получение статистики :: R для работы с PerlApp (или PAR) - PullRequest
0 голосов
/ 01 апреля 2012

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

Вот что они говорят:

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

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

Какие-нибудь предложения по преодолению этой проблемы?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

Я думаю, что вы обречены. Только не делайте .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 голосов
/ 04 апреля 2012

В прошлом году я почти полностью переписал Statistics :: R, чтобы сделать его более быстрым, независимым от платформы и надежным. Я выбрал выполнение вызовов R и различных операций ввода-вывода через IPC :: Run.

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

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

...