Получение статистики::R для работы с PerlApp (или PAR)

Я пытаюсь сделать.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::Run в 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

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

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

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

Другие вопросы по тегам