2015-05-29 1545 views
-1

我想寫一個ruby腳本,然後調用另一個ruby腳本。例如,我想從腳本運行「test1.rb」。 的test1.rb進行了簡化,只是這樣做:Ruby - 從腳本運行rb文件

print "1" 

然後得到的結果( - > 1)。

我試圖用反引號或其他執行命令(%x [#{「test1.rb」}],system(「test1.rb」)等)完成此問題,但它不起作用。

因此,任何想法如何調用一個腳本,然後調用另一個腳本(要麼放棄總控制或分叉),並得到結果?

感謝

+0

什麼了'系統( 「test1.rb」)'做什麼?你有沒有嘗試完全(絕對)路徑到'test.rb'? – shivam

+0

你的意思是「它沒有工作」是什麼意思?我猜你的嘗試失敗,因爲在命令行鍵入'test1.rb'將不起作用:'test1.rb'不是一個可執行文件。您需要使用Ruby執行腳本(例如'system(「ruby」,「test1.rb」)'),或者使用'chmod'命令可執行文件並添加一個shebang行。 –

回答

1

您可能需要使用open3

require 'open3' 
cmd = 'ruby test1.rb' 
#You may change the contents of cmd like you would run it from the command line; like ruby [directory]/filename 
Open3.popen3(cmd) do |stdin, stdout| 
    var = stdout.read 
    puts var 
end 
+0

這實際上可能是@ huri.ferenc所需要的。 – Ninigi

+0

我認爲這是一個非常好的腳本。 –

+0

我試過這個,但是返回錯誤信息:「找不到文件(1)」 –

0
system('ruby test1.rb') # should do the trick 

您也可以test1的可執行文件(用chmod),並添加Test1上頂部的家當線。

然後,您可以撥打

system("./test1.rb") 
3

你可以簡單地要求的文件,這將加載代碼並執行:

require_relative "path/test1" 

對於有控制研究在運行代碼的緣故,我會建議你的腳本放在一個方法中:

# In test1.rb 
def exec_my_script 
puts 1 
end 

# In your main script 
require_relative "path/test1" 
exec_my_script 

編輯:好的,因爲這似乎並不爲你的用例工作,你可以讀取該文件作爲字符串和eval字符串像這樣:

result = eval(File.read("path/test1.rb")) 
# do something with result 

我不喜歡這種做法,因爲感覺有點「哈克」,並且通過一切手段是不安全的,它只會工作,如果在你的test1腳本中調用的最後一件東西返回你需要的結果...

+1

我真的無法想象你會想以任何其他方式做到這一點。 +1 –

+0

是的,這是一個好主意,但我無法修改測試文件。 –

+0

我必須在腳本中調用更多相同的測試文件,並在運行後得到結果。 –

0

好吧,系統('ruby test1.rb')和系統(「ruby」,「test1.rb」)命令起作用。

現在,我想將返回值(「1」)設置爲一個變量。

我該怎麼做?反引號可以做到這一點嗎?