Выполнение процесса Cygwin из .NET? - PullRequest
4 голосов
/ 27 февраля 2009

Я пытаюсь запустить Cygwin-версию ruby.exe из приложения .NET, но я застрял.

c:\>"c:\cygwin\bin\ruby.exe" c:\test\ruby.rb
/usr/bin/ruby: no such file to load -- ubygems (LoadError)

Как видите, Ruby не может найти библиотеки, потому что он ищет пути в стиле Linux.

Очевидно, что когда я запускаю ruby.exe из .NET, поскольку он не может найти библиотеки, происходит сбой, как указано выше.

Если я не загружаю какую-либо библиотеку, она работает нормально:

c:\>"c:\cygwin\bin\ruby.exe" -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-cygwin]

Первоначально cygwin начинается с этого cygwin.bat

chdir C:\cygwin\bin
bash --login -i

Как я могу заставить .NET сначала войти в среду cygwin, а затем выполнить ruby ​​в этой среде?

  • Я не могу использовать Windows Ruby, мне нужен Cygwin Ruby.
  • Я знаю о возможном использовании интерактивного вождения "bash", но это звучит грязно, если нет хорошего способа сделать это.

Ответы [ 2 ]

4 голосов
/ 27 февраля 2009

Используете ли вы, возможно, смешение родных рубинов Windows и рубинов Cygwin? Использование Cygwin rubygems, кажется, работает нормально для меня. (Почему ваш интерпретатор Cygwin ruby, по-видимому, ищет путь с обратной косой чертой в нем?).

В качестве альтернативы, вы пробовали run.exe?

C:\cygwin\bin\run.exe -p /starting/dir exe_to_run

Вот запись man-страницы:

ИМЯ

run - запускать программы со скрытым окном консоли

СИНТАКСИС

запустить [-p путь] команда [-wait] аргументы

runcommand [-p путь] [-wait] аргументы

ОПИСАНИЕ

Программы Windows - это программы с графическим интерфейсом или консольные программы. когда запущенные консольные программы будут либо присоединяться к существующей консоли или создайте новый. Программы с графическим интерфейсом никогда не могут подключаться к единственный. Нет возможности подключиться к существующей консоли, но скрыть ее, если запущен как программа с графическим интерфейсом.

run сделает это за вас. Он работает как промежуточный и запускает грамм, но скрывает окно консоли.

С помощью -p path вы можете добавить путь к переменной среды PATH.

Выдача -wait в качестве первого аргумента программы заставит запуск программы ждать завершение, в противном случае возвращается немедленно.

Второй вариант - для создания обёрток. Если исполняемый файл с именем runcommand (например, runemacs), run попытается запустить программу (например, Emacs).

Примеры * * тысяча тридцать два

запустите -p / usr / X11R6 / bin xterm

запустить emacs -wait runemacs -wait

запустить make -wait

3 голосов
/ 27 февраля 2009

Почему бы вам не запустить неинтерактивную оболочку bash, которая запускает ruby ​​из вашего приложения .NET? Что-то вроде:

bash --login -c <your-path-to-ruby> <your-library-to-load>

Не уверен, что ваша файловая структура, но, например,

bash --login -c /usr/bin/ruby ~/test/ruby.rb

Посмотрите опцию -c со страницы руководства bash для получения дополнительной информации.

...