- ベストアンサー
Ruby初心者のための他のファイルの実行方法とBuildコマンドについて
- Ruby初心者の方に、Rubyから他のファイルを実行する方法と自動で入力を行う方法について教えてください。
- また、RubyからBuildコマンドを実行する時のRubyの状態についても教えてください。Build中はRubyが重くなる可能性があるので心配です。
- 皆様のアドバイスをお待ちしています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
test.batに文字を渡すだけなら IO.popen("test.bat", "w") do |out| out.puts "foobarbaz" end test.batの出力をRubyスクリプトで受け取るなら、こんな感じでどうでしょう。 require 'open3' Open3.popen3("test.bat") do |stdin, stdout, stderr| stderr.close stdin.puts "foobarbaz" stdin.close while line = stdout.gets puts "ruby : " + line end end う~ん、pauseで停止しませんね。 > Buildは別プロセスで動いている状態になっていると思いますが、 > Build中はRubyはどのような状態になるでしょうか? よくわかりませんが、Buildのプロセスの終了待ちではないでしょうか。
その他の回答 (2)
- siffon9
- ベストアンサー率64% (136/211)
No.1です。 私もWindows環境で使用しているので、そんなはずは……と思ったのですが たしかに ActiveScriptRuby 1.8.7(p299)ではpopen3はエラーになりますね。 私が動作確認したのは以下です。 Ruby-1.9.1-p429 (RI抜き) Microsoft Installter Package(2010/07/021 version 28523) (http://www.artonx.org/data/asr/) # 先の回答にも書きましたが、test.batに文字を渡すだけならIO.popenで良いと思います。 一応、情報として追記させて頂きました。
- kmee
- ベストアンサー率55% (1857/3366)
別解。 1) SET /P で入力するのではなく、コマンドライン引数にして %1,%2...で参照する 2) test.bat の内容をRubyに移植する。 > RubyからBuildコマンドを実行したい その起動方法と処理次第でしょう。 exec()だと実行するコマンドに移行する形になるので、Runy自体が無くなります。 system()は呼び出したプロセスの終了を待つので、Ruby自体の処理はほとんどありません。 バッククオートも待ちますが、出力を文字列に蓄えるので、出力が大量だと影響があるかもしれません。 popen等だと、Ruby側の入出力処理(gets,puts等)が遅いと、ビルド側が待たされるかもしれません。 spawnで実行して、終了を待ち時間無しのループで確認するような作りにすると、このループが負荷になるかもしれません。
お礼
別回答ありがとうございます!! > 1) > SET /P で入力するのではなく、コマンドライン引数にして %1,%2...で参照する > 2) > test.bat の内容をRubyに移植する。 test.batの変更はせずに行いたいんですよね。。。 標準入力に対して自動的に入力できたら便利だなぁとおもって。 > exec()だと実行するコマンドに移行する形になるので、Runy自体が無くなります。 Build実行後、続けてのrubyの処理はできなくなるということでしょうか? Build実行後、続けて処理するならば、 > system()は呼び出したプロセスの終了を待つので、Ruby自体の処理はほとんどありません。 がBuild時の余計な負荷は少なく、処理も続けてできそうでしょうか?
お礼
早速の回答ありがとうございます。 上記実行してみましたが、 windows環境なので、open3が使用できませんでした。。。。 > う~ん、pauseで停止しませんね。 pauseで停止しなくても大丈夫です。 test.batを起動後、またrubyで別の処理を続けたいので。。